2012-04-28 40 views
6

有我碰到了昨天晚上,我現在已經解決了兩個問題,但我不是100%肯定,爲什麼我做了什麼已經解決了他們,並希望也許有人可以提供一些因爲我已經翻過了很多岩石,並沒有運氣!兩個獨特的命名管道相互矛盾和InvalidCredentialException

第一個問題

的第一個問題是,我有兩個獨特的命名管道這是兩個獨立的程序:

  • net.pipe://本地主機/ superuniquepipe1
  • 網。管://本地主機/ superuniquepipe2

但是,第二個方案推出會拋出異常(我貝利前一天它是AddressAlreadyInUseException)由於地址已被使用而打開ServiceHost。

的方式我實例這些ServiceHosts如下:

Uri[] baseAddresses = new Uri[] { new Uri("net.pipe://localhost") }; 
this.host = new ServiceHost(this, baseAddresses); 
this.host.AddServiceEndpoint(typeof(IHostType), new NetNamedPipeBinding(), "superuniquepipe1"); 
this.host.Open(); 

所以我指定localhost第一的基地址,然後添加端點時指定它的休息,順便我決定,這是改變代碼如下:

this.host = new ServiceHost(this); 
this.host.AddServiceEndpoint(typeof(IHostType), new NetNamedPipeBinding(), "net.pipe://localhost/superuniquepipe2"); 
this.host.Open(); 

上午我在說這個工作的原因,糾正,是因爲它僅檢查基址,而不是我試圖添加的終點?並使用第二個代碼示例有效/安全的方式來讓多個程序在「localhost」上進行監聽?

第二問題

在試圖修復以上,我已經從本地主機改變基地址到多個不同的唯一的字符串的例如「net.pipe:// rawrwhyisntthisworkingsadface」,但這樣做時,我會從客戶端試圖建立連接的InvalidCredentialException呈現(見下面的代碼)

我的印象是一個命名管道可以從字面上是下命名任何東西,任何人都可以點亮這個?

ChannelFactory<IHostType> factory = new ChannelFactory<IHostType>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://rawrwhyisntthisworkingsadface/superuniquepipe2")); 
IHostType proxy = factory.CreateChannel(); 
proxy.CallSomeMethodAndGetAnException(); 

任何投入將不勝感激,因爲我說我已經解決了這個問題,只是想知道爲什麼我的解決方案的工作,但如果你我是如何解決已經看到它的一個缺陷,並可以建議更好這樣做請這樣做:)的方式

+0

爲了擴大這一點,我得到我相信同樣的問題,這是個例外: ** [TYPE]:** System.ServiceModel.AddressAlreadyInUseException ** [信息]:** 無法監聽管道名稱'net.pipe:// localhost /',因爲另一個管道端點已經在監聽該名稱。 – ebol2000 2015-07-16 22:36:16

回答

13

回覆問題1:

的WCF NetNamedPipeBinding使用名爲共享內存段發佈到其客戶端通過該服務可稱爲管道的實際名稱。管道名稱本身是一個GUID,每次打開服務主機時都會重新生成一次。它是用於發佈依賴於服務URL的服務的共享內存部分的名稱。如果定義了基地址,則使用基地址來派生該名稱。

這意味着你永遠只能有在此使用特定的基址,其NetNamedPipe端點一次運行一個WCF服務應用程序。如果您嘗試啓動另一個應用程序,則它將因AddressAlreadyInUseException而失敗,因爲它發現WCF想要用於發佈位置(從基地址派生)的名稱已被其他應用程序佔用。

如果您沒有指定基地址,併爲每個服務提供絕對唯一的服務URL,則發佈位置的名稱現在是從完整絕對URL派生而來的,並且應用程序之間沒有名稱衝突。這是擁有多個WCF命名管道服務的完全有效和安全的方法。

回覆問題2:

上,您可以使用該服務URL的主機名部分的任何服務端。這是由於默認情況下在NetNamePipeBinding中應用了HostNameComparisonMode設置,因爲WCF中用於​​派生共享內存發佈位置名稱的算法將通配符替換爲主機名see here以啓用配置的主機名比較模式。但是,在客戶端,服務URL受到約束:主機部分必須真正解析爲本地主機(即它是localhost,正確的IP地址或正確的機器名稱)。

+0

感謝所有的信息,非常感謝:) – rastating 2012-04-29 15:05:32

相關問題