Управление именем именованного канала при размещении привязки WCF net.pipe в IIS
У меня есть сервис, доступный через http и net.pipe. Он размещается в IIS 7 (Server 2008). Возможно, я размещаю разные экземпляры этой службы для нескольких клиентов на одном компьютере, и, следовательно, HTTP настроен с виртуальными именами хостов и т. Д. Это все работает нормально.
Я подумал, что сделаю то же самое для привязки именованного канала сети - используя некоторую форму "имени виртуального хоста" клиентов в базовом адресе именованного канала, что позволит мне получить доступ к различным экземплярам клиентов с разными урнами net.pipe (я понимаю сеть. Имена каналов - это URN, а не URL-адреса, поэтому они могут быть произвольными, но я подумал, что последую примеру, аналогичному HTTP-адресам.
Вот мой web.config
<service name="Administration" behaviorConfiguration="AdministrationBehavior">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="normalWsBinding" contract="IAdministration" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<endpoint address="" binding="netNamedPipeBinding" bindingConfiguration="normalNetNamedPipeBinding" contract="IAdministration" />
<endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://virtualhostname.com/service" />
<add baseAddress="net.pipe://virtualhostname.com/administration/service" />
</baseAddresses>
</host>
</service>
Однако при доступе к WSDL для службы IIS считает, что базовый адрес для net.pipe игнорируется. Вместо этого я получаю реальное имя хоста машины и адрес URN net.pipe, который, кажется, полностью отформатирован IIS.
<wsdl:port name="NetNamedPipeBinding_IAdministration" binding="tns:NetNamedPipeBinding_IAdministration">
<soap12:address location="net.pipe://realhostname/service/Administration.svc"/>
<wsa10:EndpointReference>
<wsa10:Address>net.pipe://realhostname.com/service/Administration.svc</wsa10:Address>
<Identity>
<Spn>host/realhostname.com</Spn>
</Identity>
</wsa10:EndpointReference>
</wsdl:port>
Без контроля над тем, как формируются имена net.pipe, я не смогу различить несколько экземпляров обслуживания клиентов на компьютере. Кто-нибудь знает, как можно управлять сетевым UNN привязки именованных каналов в среде IIS?
(Во время тестирования я часто использую автономный хостинг net.pipe (т. Е. Новый ServiceHost()), поэтому я знаю, что мои привязки net.pipe работают вне IIS и позволяют контролировать точно используемый URN именованного канала)
Если имена не могут контролироваться в IIS - есть ли у кого-нибудь опыт хостинга и доступа к нескольким отдельным экземплярам службы net.pipe на одном компьютере?
2 ответа
Это старый вопрос, но я решил добавить свой ответ, так как мне также нужен был ответ на этот вопрос (и, возможно, есть другие, которым он тоже нужен).
Базовый адрес службы WCF, размещенной на IIS, контролируется IIS и не может быть переопределен в web.config. Вместо этого вы можете управлять базовыми адресами, обновляя информацию о привязке сайта IIS для сайта, на котором размещается ваша служба.
Большая часть документации, которую я нашел в Интернете, предлагает использовать * в качестве конфигурации привязки для net.pipe. Но если вместо этого вы используете "virtualsite.com" в качестве значения конфигурации привязки, базовый адрес вашей конечной точки net.pipe будет "virtualsite.com", а не именем компьютера.
Вот пример использования appcmd для настройки сайта в IIS с правильной привязкой net.pipe:
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.pipe',bindingInformation='virtualhostname.com']
Одно замечание о HostnameComparisonMode, это не влияет на IIS в соответствии с MSDN:
Эти значения не действуют при использовании внутри среды размещения служб IIS или Windows Process Activation Service (WAS). В этих случаях WCF использует любой режим сравнения имен хостов, предоставляемый веб-сайтом IIS, на котором размещаются службы WCF.
Вместо этого вы должны использовать механизм, который я описал выше. Я понял это, исследуя, как работает привязка имени хоста в HTTP для IIS. К сожалению, я не смог найти никакой официальной документации для этого сценария на основе IIS для других транспортов WCF.
Похоже, что часть имени хоста URI игнорируется и заменяется реализацией, основанной на HostNameComparisonMode привязки канала. Вы можете попробовать изменить его на "Точный" через конфигурацию сервиса...
NetNamedPipeBinding.HostnameComparisonMode Значение HostnameComparisonMode, которое указывает, используется ли имя хоста для доступа к службе при сопоставлении URI. Значением по умолчанию является StrongWildcard(), которое игнорирует имя хоста в совпадении.
Смотрите синтаксис конфигурации здесь: http://msdn.microsoft.com/en-us/library/ms731291.aspx