controlando el nombre de una tubería con nombre cuando se aloja el enlace WCF net.pipe en IIS

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Tengo un servicio accesible a través de http y net.pipe. Está alojado en IIS 7 (Server 2008). Es posible que aloje diferentes instancias de este servicio para varios clientes en la misma máquina y, por lo tanto, el HTTP está configurado con nombres de host virtuales, etc. Todo esto funciona bien.

Pensé que haría algo similar para el enlace de tubería con nombre de red, usando alguna forma de el 'nombre de host virtual' de los clientes en la dirección base de la tubería nombrada, lo que me permite para acceder a las diferentes instancias de clientes con diferentes urnas de net.pipe (me doy cuenta los nombres de net.pipe son URN, no URL, por lo que pueden ser esencialmente arbitrarios pero Pensé que seguiría un patrón similar a las direcciones HTTP).

Aquí está mi 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>

Sin embargo, al acceder a WSDL para el servicio: la dirección base para net.pipe parece ser ignorado por IIS. En cambio, obtengo el verdadero nombre de host de la máquina, y un net.pipe address URN que parece haber sido formateada completamente por 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>

Sin control sobre la forma en que se forman los nombres de net.pipe, no podré discriminar entre las múltiples instancias de servicio al cliente en la máquina. ¿Alguien tiene alguna idea de cómo ¿El URN de enlace de tubería con nombre de red se puede controlar dentro del entorno IIS?

(Realizo mucho alojamiento independiente de net.pipe durante las pruebas (es decir, nuevo ServiceHost ())   así que sé que mis enlaces net.pipe funcionan fuera de IIS y permiten el control   sobre el tubo con nombre exacto URN utilizado)

Si los nombres no se pueden controlar dentro de IIS, ¿alguien tiene alguna experiencia con Hospedaje y acceso a múltiples instancias separadas del servicio net.pipe en el mismo máquina?

¿Fue útil?

Solución

Esta es una pregunta antigua, pero pensé que agregaría mi respuesta, ya que también necesitaba una respuesta para esto (y tal vez hay otros que también la necesitan).

La dirección base de un servicio WCF alojado en IIS está controlada por IIS y no se puede anular en web.config. En su lugar, puede controlar las direcciones base actualizando la información de enlace del sitio IIS para el sitio en el que aloja su servicio.

La mayor parte de la documentación que encontré en línea sugiere usar * como la configuración de enlace para net.pipe. Pero si en su lugar usa " virtualsite.com " como valor de configuración de enlace, la dirección base de su punto final net.pipe será "virtualsite.com". en lugar del nombre de la máquina.

Aquí hay un ejemplo usando appcmd para configurar un sitio en IIS con el enlace net.pipe correcto:

%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.pipe',bindingInformation='virtualhostname.com']

Una nota sobre HostnameComparisonMode , no tiene ningún efecto en IIS de acuerdo con MSDN :

  

Estos valores no tienen efecto cuando se usan dentro de los servicios de Internet Information Services (IIS) o el entorno de alojamiento del Servicio de activación de procesos de Windows (WAS). En esos casos, WCF utiliza cualquier modo de comparación de nombres de host proporcionado por el sitio web de IIS que aloja los servicios de WCF.

En su lugar, debe usar el mecanismo que describí anteriormente. Lo descubrí investigando cómo funciona el enlace de nombre de host en HTTP para IIS. Desafortunadamente, no he podido encontrar ninguna documentación oficial para este escenario basado en IIS para otros transportes WCF.

Otros consejos

Parece que la parte del nombre de host del URI se ignora y se reemplaza por la implementación basada en HostNameComparisonMode del enlace de canal. Puede intentar cambiarlo a "Exacto" a través de la configuración del servicio ...

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

  

NetNamedPipeBinding.HostnameComparisonMode   El valor HostnameComparisonMode que indica si el nombre de host se usa para llegar al servicio cuando coincide con el URI. El valor predeterminado es StrongWildcard (), que ignora el nombre de host en la coincidencia.

Vea la sintaxis de configuración aquí: http://msdn.microsoft.com/en-us/library/ms731291. aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top