Возможно ли, чтобы клиент WCF, работающий в ASPX, вызывал SVC через net.pipe на другом сайте на том же компьютере?
У меня есть два веб-сайта - один с файлом aspx, один со службой wcf с двумя конечными точками, один http и один именованные каналы. Они оба работают на одной машине, поэтому они выглядят как кандидат для использования привязки net.pipe.
Файл aspx создает клиент службы и пытается вызвать net.pipe. И я получаю это:
"Ошибка сервера в приложении" /dev ". Сообщение не может быть отправлено, поскольку служба по адресу конечной точки" net.pipe://localhost/netNamedPipeBinding "недоступна для протокола адреса".
Поиск в Google предполагает, что это может быть проблемой безопасности (нет ошибок разрешений, как и ошибок прослушивателей), но я уже предоставил права NTFS группе пользователей [NETWORK] на файлы веб-сайтов со службами и никаких изменений.
Сайт с aspx использует проверку подлинности с помощью форм (то есть не аутентификацию Windows), а веб-сайт службы является анонимной аутентификацией. В файле web.config безопасность net.pipe установлена на ="Нет"
Локально это работает нормально - хотя мне приходится запускать хост именованных каналов в консольном приложении, так как Visual Studio Dev Server не может делать именованные каналы. Кроме того, конечная точка Http отлично работает на IIS.
Это работает.NET 4.0, IIS 7.5, Win2008.
IIS Config Насколько я могу судить,
- net.pipe был включен для веб-сайта службы, с информацией о конфигурации *
- WAS установлен и включен (через функции Windows)
- служба Windows прослушивателя net.pipe включена.
- Каждый веб-сайт имеет анонимный доступ (авторизация выполняется с помощью стороннего единого входа на сервере)
- Каждый веб-сайт имеет свой собственный пул приложений (вероятно, не актуально)
- Сайт службы находится в режиме веб-сада (вероятно, не актуально)
Service Config (работает на IIS на одной машине, другой VDIR)
<system.serviceModel>
<bindings>
<netNamedPipeBinding>
<binding name="netNamedPipeBindingConfig" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport protectionLevel="EncryptAndSign" />
</security>
</binding>
</netNamedPipeBinding>
</bindings>
<services>
<service name="MyService">
<host>
<baseAddresses>
<add baseAddress="net.pipe://localhost/" />
</baseAddresses>
</host>
<endpoint
address="netNamedPipeBinding"
bindingConfiguration="netNamedPipeBindingConfig"
binding="netNamedPipeBinding"
contract="IMyService" >
</endpoint>
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
Client Config (веб-сайт ASP.NET, тот же компьютер, другой VDIR от службы)
<system.serviceModel>
<bindings>
<netNamedPipeBinding>
<binding name="NetNamedPipeBinding_IMyService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport protectionLevel="EncryptAndSign" />
</security>
</binding>
</netNamedPipeBinding>
</bindings>
<client>
<endpoint
address="net.pipe://localhost/netNamedPipeBinding"
binding="netNamedPipeBinding"
bindingConfiguration="NetNamedPipeBinding_IMyService"
contract="MyService.IMyService"
name="NetNamedPipeBinding_IMyService">
</endpoint>
</client>
</system.serviceModel>
(Сервис и названия контрактов изменены, чтобы защитить невинных)
C# не является чем-то особенным, просто сгенерированный прокси Add-Service-Reference. (И весь этот код прекрасно работает с привязкой wsHttp
1 ответ
Вы не можете установить базовый адрес именованного канала, когда он размещен в IIS таким способом. В результате клиент не может найти услугу. Посмотрите на ответ здесь для получения более подробной информации: контроль имени-имен-трубы-когда-хостинга-wcf-net-pipe-binding-in-iis