Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在IIS中承载WCF net.pipe绑定时控制命名管道的名称_Wcf_Iis_Named Pipes - Fatal编程技术网

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

在IIS中承载WCF net.pipe绑定时控制命名管道的名称,wcf,iis,named-pipes,Wcf,Iis,Named Pipes,我有一个可以通过http和net.pipe访问的服务。它被托管在IIS 7(服务器2008)中。我可能在同一台机器上为多个客户托管此服务的不同实例,因此HTTP是使用虚拟主机名等设置的。这一切都很正常 我想我会为名为管道绑定的网络做类似的事情——使用某种形式的 客户的“virtualhostname”位于命名管道基址中,因此允许 使用不同的net.pipe URN访问不同的客户实例(我意识到 net.pipe名称不是URN的URL,因此它们基本上可以是任意的,但 我想我会遵循与HTTP地址类似的

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

我想我会为名为管道绑定的网络做类似的事情——使用某种形式的 客户的“virtualhostname”位于命名管道基址中,因此允许 使用不同的net.pipe URN访问不同的客户实例(我意识到 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>

净。pipe://realhostname.com/service/Administration.svc
host/realhostname.com
由于无法控制net.pipe名称的形成方式,我将无法进行区分 在计算机上的多个客户服务实例之间。有人知道怎么做吗 是否可以在IIS环境中控制名为管道绑定URN的网络

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

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

似乎URI的主机名部分被忽略,并由基于通道绑定的HostNameComparisonMode的实现替换。您可以尝试通过服务的配置将其更改为“精确”

NetNamedPipeBinding.HostnameComparisonMode HostnameComparisonMode值,指示在匹配URI时是否使用主机名访问服务。默认值为StrongWildcard(),它忽略匹配中的主机名

请参见此处的配置语法:

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

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']
关于主机名ComparisonMode的一个注意事项是,根据以下说明,它在IIS中不起作用:

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


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

您知道net.pipe绑定仅在“计算机”上工作,例如,您无法从其他计算机访问这些绑定,即使它们托管在IIS中。…当托管在IIS中时,你不需要选择你的服务地址,它总是
http://machinename[:port]/virtualdir/yourservice.svc
-我怀疑这同样适用于net.pipe地址-如果托管在IIS中,您无法控制它们的命名…是的,HTTP端点用于机器外访问,我希望使用net.pipe端点进行一些有限(但希望更快)的机器访问。但是,当我在IIS中托管HTTP端点时,我确实可以选择服务地址(在某些级别),因为我指定了要使用的域。这让我有多个IIS站点,每个站点都可以通过不同的URL访问,也就是说,如果我不能为net.pipe选择基本地址,我怎么能在IIS中为不同的客户托管多个net.pipe绑定?我仍然对这方面的想法感兴趣-问题是否不清楚,或者没有很多人这样做?如果有帮助,我为Windows服务中托管的服务执行了此操作,它工作正常,名称是从虚拟主机名推断出来的。我不确定这是否是您最初回答后的新名称,但根据您的链接,HostnameComparisonMode在IIS中无效。谢谢Chris。我需要解决这个问题已经很久了,但这似乎是一个很好的信息!当我们将服务从Windows Server 2008 R2环境移动到Windows Server 2016环境时,这为我解决了这个问题。*绑定在Server2008中为“localhost”工作,但在2016年中断;在将其显式更新为“localhost”之后,这为我解决了这个问题。