使用NetNamedPipe的WCF多个应用程序

时间:2011-03-16 13:48:48

标签: c# wcf named-pipes netnamedpipebinding

我正在尝试在同一台计算机上运行多个WCF服务托管应用程序。

我想在一个应用程序中运行多个应用程序 - 而不是多个服务。

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

我为每个应用更改“FOO”,但仍然无法启动多个服务。 猜猜它很简单,但我卡住了:(

此致

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

如果您需要为不同的服务合同创建服务主机,如下所示:

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

然后你需要为每个新的ServiceHost使用不同的基地址,如Mathew的回答所示。如果所有服务主机都使用相同类型(MyClass1),那么您可能只需要为同一服务创建多个端点。每个端点可以用于该服务中的不同接口(即ISomeInterface1,ISomeInterface2,...)。