【问题标题】:controlling the name of a named pipe when hosting WCF net.pipe binding in IIS在 IIS 中托管 WCF net.pipe 绑定时控制命名管道的名称
【发布时间】:2009-11-27 01:43:07
【问题描述】:

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

我想我会为网络命名管道绑定做类似的事情——使用某种形式的 命名管道基地址中的客户“虚拟主机名”,因此允许我 使用不同的 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 名称的形成方式,我将无法区分 在机器上的多个客户服务实例之间。有没有人知道如何 网络命名管道绑定URN可以在IIS环境下控制吗?

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

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

【问题讨论】:

  • 您知道 net.pipe 绑定只能“在机器上”工作,例如即使它们托管在 IIS 中,您也无法从其他机器访问它们......
  • 在 IIS 中托管时,您实际上无法选择服务地址 - 它始终为 http://machinename[:port]/virtualdir/yourservice.svc - 我怀疑 net.pipe 地址也是如此 - 您无法控制它们如果托管在 IIS 中,则命名......
  • 是的,HTTP 端点用于机器外访问,我希望使用 net.pipe 端点进行一些有限(但希望更快)的机器访问。当我在 IIS 中托管我的 HTTP 端点时,我确实可以选择服务地址(在某种程度上),因为我指定了我想要使用的域。这让我有多个 IIS 站点,每个站点都可以通过不同的 url 访问,即 customer1.com/admin/Admin.svccustomer2.com/admin/Admin.svc 如果我不能为 net.pipe 选择我的基地址,我如何在 IIS 中为不同的客户托管多个 net.pipe 绑定?
  • 我仍然对有关此的任何想法感兴趣 - 问题不清楚还是没有多少人这样做?
  • 如果有帮助,我已经为托管在 Windows 服务中的服务完成了此操作,并且运行良好,名称是从虚拟主机名中推断出来的。

标签: wcf iis named-pipes


【解决方案1】:

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

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在IIS中没有作用:

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

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

【讨论】:

  • 谢谢克里斯。我对解决这个问题的需求早已过去,但这看起来是个好信息!
  • 当我们将服务从 Windows Server 2008 R2 环境迁移到 Windows Server 2016 环境时,这为我解决了这个问题。 * 绑定适用于 Server 2008 中的“localhost”,但在 2016 年中断;将其明确更新为“localhost”后,这为我解决了问题。
【解决方案2】:

似乎 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

【讨论】:

  • 我不确定这是否是自您的原始答案以来的新内容,但根据您的链接,HostnameComparisonMode 在 IIS 中无效。
猜你喜欢
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2011-03-05
  • 1970-01-01
相关资源
最近更新 更多