2011-03-16 47 views
9

WCF多個應用程序,我試圖運行在同一臺機器多個WCF服務託管的應用程序。使用NetNamedPipe

我想要運行多個應用程序 - 沒有多種服務於一體的應用程序。

var host = new ServiceHost(typeof(MyClass1), new Uri[] { new Uri("net.pipe://localhost") }); 
host.AddServiceEndpoint(typeof(ISomeInterface), new NetNamedPipeBinding(), "FOO"); 
host.Open(); 

我爲每個應用程序更改「FOO」,但仍無法啓動多個服務。 猜它很簡單,但即時通訊堅持:(

問候

回答

8

走近它像這樣會做你想要什麼,我相信:

string relativeUriPart = GetUniquePartFromConfigOfThisApplicationInstance(); 
var host = new ServiceHost(typeof(MyClass1)); // No base addresses specified 
host.AddServiceEndpoint(
    typeof(ISomeInterface), 
    new NetNamedPipeBinding(), 
    "net.pipe://localhost/" + relativeUriPart); // Specify absolute URI for endpoint 
host.Open(); 

這是因爲,如果你指定使用net.pipe方案的基址,它是被用來獲取這個基址監聽器使用的管道名稱[請參閱下面的編輯],並且這在每個應用程序實例中都是相同的,因此只有第一個應用程序的監聽器可以創建管道 - 其他監控器會失敗,正如您已經注意到的那樣。

在端點級別使用絕對URI,沒有基地址,偵聽器是通過從完全絕對URI派生的管道名稱創建的[請參閱下面的編輯],這在每個應用程序實例中是不同的,因此每個應用程序的監聽者可以創建自己獨特的管道而不會有任何問題。


編輯:爲了更精確,管道名稱本身並沒有從服務地址導出的 - 它是一個GUID每個服務被打開時都會改變。什麼是從服務地址導出是通過該管道的實際名稱發佈到潛在客戶的共享內存對象的名稱。 See here for more details.

0

如果您需要爲不同的服務合同,爲在這裏展示服務主機:

...  
host1 = new SeviceHost(typeof(MyClass1, ...); 
host2 = new ServiceHost(typeof(MyClass2, ...); 
... 

那麼你就需要使用不同的基對於每一個新的ServiceHost爲馬修的回答表明地址,如果您的所有服務的主機是相同的typeof(MyClass1的),那麼你可能只需要爲同一個服務中創建多個端點。每個端點可能是一個不同的接口(即ISomeInterface1, ISomeInterface2,...)。

+0

我想在一個應用程序中運行多個應用程序而不是多個服務。 – Jaster 2011-03-16 15:11:57

+0

您能否定義「應用程序」?如果您的應用程序使用多個服務合同(接口),只要爲每個實現的接口添加端點,就可以使用具有單個主機的單個WCF服務。如果您創建了多個WCF服務,每個實現不同的接口,則必須爲每個服務使用單獨的ServiceHost。 – 2011-03-16 15:18:15

+0

application = process。換句話說:我想要幾個進程在不同的「地址」上託管相同的服務。 – Jaster 2011-03-16 16:03:23