управление именем именованного канала при размещении привязки WCF net.pipe в IIS - PullRequest
6 голосов
/ 27 ноября 2009

У меня есть сервис, доступный через http и net.pipe. Он размещается в IIS 7 (Server 2008). Возможно, я размещаю разные экземпляры этой службы для нескольких клиентов на одном компьютере, и поэтому HTTP настроен с виртуальными именами хостов и т. Д.

Я думал, что сделаю подобное для сетевого связывания именованных каналов - используя некоторую форму клиенты 'имя виртуального хоста' в базовом адресе именованного канала, поэтому я могу чтобы получить доступ к различным экземплярам клиентов с разными урнами net.pipe (я понимаю, имена 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 для сервиса - кажется, что базовый адрес для net.pipe быть проигнорированным IIS. Вместо этого я получаю реальное имя хоста машины и Адрес 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, я не смогу различить между несколькими экземплярами обслуживания клиентов на машине. Кто-нибудь знает, как можно ли контролировать URN привязки именованных каналов в среде IIS?

(во время тестирования я часто использую автономный хостинг net.pipe (т.е. новый ServiceHost ()) поэтому я знаю, что мои привязки net.pipe работают вне IIS и позволяют контролировать над точной именованной трубой URN используется)

Если имена не могут контролироваться в IIS - есть ли у кого-нибудь опыт работы с хостинг и доступ к нескольким отдельным экземплярам службы net.pipe на одном машина

Ответы [ 2 ]

3 голосов
/ 08 января 2014

Это старый вопрос, но я решил добавить свой ответ, так как мне также нужен был ответ для этого (и, возможно, есть другие, которые тоже нуждаются в этом).

Базовый адрес службы 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 :

Эти значения не действуют при использовании в среде размещения Internet Information Services (IIS) или Windows Process Activation Service (WAS). В этих случаях WCF использует любой режим сравнения имен узлов, предоставляемый веб-сайтом IIS, на котором размещаются службы WCF.

Вместо этого вы должны использовать механизм, который я описал выше. Я понял это, исследуя, как работает привязка имени хоста в HTTP для IIS. К сожалению, я не смог найти никакой официальной документации для этого сценария на основе IIS для других транспортов WCF.

0 голосов
/ 23 июля 2010

Похоже, что часть имени хоста URI игнорируется и заменяется реализацией, основанной на HostNameComparisonMode привязки канала. Вы можете попробовать изменить его на «Точный» через конфигурацию сервиса ...

http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.hostnamecomparisonmode.aspx

NetNamedPipeBinding.HostnameComparisonMode Значение HostnameComparisonMode, которое указывает, используется ли имя хоста для доступа к службе при сопоставлении URI. Значением по умолчанию является StrongWildcard (), которое игнорирует имя хоста в совпадении.

Смотрите синтаксис конфигурации здесь: http://msdn.microsoft.com/en-us/library/ms731291.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...