управление именем именованного канала при размещении привязки WCF net.pipe в IIS

StackOverflow https://stackoverflow.com/questions/1806430

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Я думал, что сделаю аналогично для привязки сетевого именованного канала - используя некоторую форму "virtualhostname" клиентов в базовом адресе именованного канала, поэтому позволяя мне чтобы получить доступ к разным экземплярам клиентов с разными урнами 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 и позволяют контролировать используемую урну с точным именем канала)

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

Это было полезно?

Решение

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

Базовый адрес службы 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 (WAS).В этих случаях WCF использует любой режим сравнения имен хостов, предоставляемый веб-сайтом IIS, на котором размещены службы WCF.

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

Другие советы

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

http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding .имя хоста в режиме сравнения.aspx

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top