2009-11-27 122 views
6

我有一個可通過http和net.pipe訪問的服務。它被託管在IIS 7(Server 2008)中。我可能在同一臺機器上爲幾個客戶託管此服務的不同實例,因此HTTP使用虛擬主機名等進行設置。這一切都工作正常。在IIS中託管WCF net.pipe綁定時控制命名管道的名稱

我想我會做的淨命名管道結合類似 - 使用某種形式 客戶在命名管道的基址「virtualhostname」的,所以讓我 不同net.pipe甕訪問不同的客戶實例(我知道 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被忽略。相反,我得到機器的真實主機名,以及似乎完全由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> 

擁有超過形成net.pipe名的方式無法控制,我將無法在機器上的多個客戶服務實例區分 。有沒有人有任何線索可以在IIS環境中控制網絡命名管道綁定URN?

(我做了很多的託管獨立net.pipe的測試期間(即新的ServiceHost()) ,所以我知道我的net.pipe綁定IIS做工作以外,也允許控制 在確切的命名管道URN使用)

如果名稱不能在IIS內控制 - 沒有人有任何經驗與 託管和訪問多個單獨的net.pipe服務實例在同一 機?

+0

您知道net.pipe綁定只能「在機器上」工作,例如,即使它們託管在IIS中,您也無法訪問其他計算機上的這些計算機.... – 2009-11-27 06:19:22

+0

當您在IIS中託管時,您並不真正選擇服務地址 - 它始終是'http:// machinename [:port ]/virtualdir/yourservice.svc' - 我懷疑這同樣適用於net.pipe地址 - 如果託管在IIS中,您無法控制其命名...... – 2009-11-27 06:20:55

+0

是的,HTTP端點用於在機外訪問,我希望能夠使用net.pipe端點來實現一些有限的(但希望更快)的機器訪問。 當我在IIS中託管我的HTTP端點時,我確實會選擇服務地址(在某個級別),因爲我指定了要使用的域。這讓我有多個IIS站點通過不同的網址 即http://customer1.com/admin/Admin.svc 和 http://customer2.com/admin/Admin.svc 如果我不能每次訪問不要選擇net.pipe的基地址,我怎樣才能在IIS中爲不同的客戶託管多個net.pipe綁定? – 2009-11-27 08:00:01

回答

2

這是一個老問題,但我想我會加入我的答案,因爲我還需要爲這個答案(也許還有其他那裏誰也需要它)。

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網站提供的任何主機名比較模式。

相反,你必須使用我上面描述的機制。我通過調查主機名綁定如何在IIS中使用HTTP來解決這個問題。不幸的是,我還找不到其他WCF傳輸的這種基於IIS的場景的任何官方文檔。

+0

謝謝克里斯。我需要解決這個問題早已過去,但這看起來像很好的信息! – 2014-01-21 01:45:53

0

看起來,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

+0

我不確定這是新的,因爲你的原始答案,但根據你的鏈接,HostnameComparisonMode在IIS中沒有效果。 – 2014-01-08 01:56:07