在IIS中托管WCF net.pipe绑定时控制命名管道的名称

And*_*son 6 iis wcf named-pipes

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

我以为我会做类似的网名命名管道绑定 - 在命名管道基地址中使用某种形式的客户'virtualhostname',因此允许我使用不同的net.pipe urns访问不同的客户实例(我意识到网络.管道名称是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>
Run Code Online (Sandbox Code Playgroud)

但是,在访问服务的WSDL时 - IIS似乎忽略了net.pipe的基址.相反,我得到了机器的真实主机名,以及似乎完全由IIS格式化的net.pipe地址URN.

<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>
Run Code Online (Sandbox Code Playgroud)

由于无法控制net.pipe名称的形成方式,我将无法区分机器上的多个客户服务实例.有没有人知道如何在IIS环境中控制网络命名管道绑定URN?

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

如果无法在IIS中控制名称 - 是否有人在同一台计算机上托管和访问多个单独的net.pipe服务实例?

Chr*_*lum 3

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

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']
Run Code Online (Sandbox Code Playgroud)

关于HostnameComparisonMode的一点说明,根据MSDN ,它在 IIS 中没有效果:

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

相反,您必须使用我上面描述的机制。我通过研究 IIS 的 HTTP 中的主机名绑定如何工作,发现了这一点。不幸的是,我无法找到有关其他 WCF 传输的基于 IIS 的方案的任何官方文档。