我可以通过http和net.pipe访问服务。它托管在IIS 7(Server 2008)中。我可能在同一台机器上为几个客户托管这项服务的不同实例,因此HTTP设置了虚拟主机名等。这一切都正常。

我以为我会做类似的网名命名管道绑定 - 使用某种形式的 命名管道基地址中的客户'virtualhostname',因此允许我 使用不同的net.pipe urns访问不同的客户实例(我意识到 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忽略。相反,我得到机器的真实主机名,和 net.pipe地址URN似乎完全由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名称的形成方式,我无法区别对待 在机器上的多个客户服务实例之间。有没有人知道如何 可以在IIS环境中控制网络命名管道绑定URN吗?

(我在测试期间做了很多独立的net.pipe托管(即新的ServiceHost())   所以我知道我的net.pipe绑定在IIS之外工作,并且允许控制   在确切命名的管道URN使用)

如果在IIS中无法控制名称 - 是否有任何人有任何经验 托管和访问多个单独的net.pipe服务实例 机?

有帮助吗?

解决方案

这是一个老问题,但我想我会添加我的答案,因为我也需要一个答案(也许还有其他人也需要它)。

IIS托管的WCF服务的基址由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 的一个注释,根据 MSDN

  

在Internet信息服务(IIS)或Windows进程激活服务(WAS)托管环境中使用时,这些值无效。在这些情况下,WCF使用托管WCF服务的IIS网站提供的任何主机名比较模式。

相反,您必须使用我上面描述的机制。我通过调查主机名绑定如何在HTTP中用于IIS来解决这个问题。不幸的是,我无法为其他WCF传输找到基于IIS的场景的任何官方文档。

其他提示

似乎忽略了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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top