controlando o nome de um pipe nomeado quando hospedagem WCF obrigatório em IIS net.pipe

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu tenho um serviço acessível via http e net.pipe. Ele está sendo hospedado no IIS 7 (Server 2008). I pode hospedar diferentes instâncias desse serviço para vários clientes na mesma máquina e, portanto, o HTTP é configurado com o Virtual nomes de máquinas etc. Isto é tudo muito bem trabalho.

Eu pensei que eu iria fazer semelhante para o tubo de rede chamado de ligação - usando alguma forma de os clientes dos VirtualHostName 'no endereço base pipe nomeado, portanto, me permitindo Para acessar os diferentes casos de clientes com diferentes urnas net.pipe (eu percebo os nomes net.pipe são de URN não URL de que eles possam ser essencialmente arbitrária, mas Eu pensei que eu iria seguir um padrão semelhante aos endereços HTTP).

Aqui está o meu 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>

No entanto, ao acessar o WSDL para o serviço - o endereço base para o net.pipe parece para ser ignorado pelo IIS. Em vez disso eu recebo o nome do host real da máquina, e uma net.pipe endereço URN que parece ter sido formatado inteiramente 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>

Com nenhum controle sobre a forma como os nomes net.pipe são formados, não vou ser capaz de discriminar entre as várias instâncias de atendimento ao cliente na máquina. Alguém tem alguma idéia de como o pipe nomeado net ligação URN pode ser controlado dentro do ambiente IIS?

(Eu faço um monte de net.pipe autônomo hospedagem durante o teste (ou seja nova ServiceHost ()) então eu sei que minhas ligações net.pipe fazer um trabalho fora do IIS, e não permitir o controle sobre o tubo exata chamado URN usado)

Se os nomes não pode ser controlado dentro de IIS - alguém tem alguma experiência com hospedagem e acesso a várias instâncias de serviço net.pipe separados na mesma máquina?

Foi útil?

Solução

Esta é uma questão de idade, mas eu percebi que eu adicionar minha resposta desde que eu também precisava de uma resposta para isso (e talvez existem outras pessoas lá fora que precisam dele também).

O endereço base de um serviço WCF IIS-hospedado é controlado pelo IIS e não pode ser substituído em web.config. Em vez disso, você pode controlar os endereços de base através da actualização do IIS informação vinculativa site para o site que está hospedando o seu serviço em.

A maioria da documentação que encontrei on-line sugere o uso de * como a configuração de ligação para net.pipe. Mas se você usar em vez "virtualsite.com" como o valor de configuração de ligação, o endereço base do seu endpoint net.pipe será "virtualsite.com" ao invés do nome da máquina.

Aqui está um exemplo usando appcmd para configurar um site no IIS com a ligação net.pipe correto:

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

Uma nota sobre HostNameComparisonMode , ele não tem efeito no IIS de acordo com MSDN :

Estes valores não têm efeito quando dentro utilizada do Internet Information Services (IIS) ou Windows Process Activation Service (WAS) ambiente de hospedagem. Nesses casos, os usos WCF quaisquer hostname modo de comparação é fornecido pelo site do IIS que hospeda os serviços WCF.

Em vez disso, você tem que usar o mecanismo que descrevi acima. Eu descobri isso por investigar como funciona a ligação hostname em HTTP para o IIS. Infelizmente, eu não tenho sido capaz de encontrar qualquer documentação oficial para este cenário baseado em IIS para outros transportes WCF.

Outras dicas

Parece que a parte do nome de host do URI é ignorado e substituído pela implementação baseia-se no HostNameComparisonMode da ligao do canal. Você pode tentar mudá-lo para "Exact" através do serviço é a configuração ...

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

NetNamedPipeBinding.HostnameComparisonMode O valor HostNameComparisonMode que indica se o nome do host usado para ligar para o serviço ao combinar o URI. O valor padrão é StrongWildcard (), que ignora o nome do host no jogo.

Veja a sintaxe de configuração aqui: http://msdn.microsoft.com/en-us/library/ms731291. aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top