使用NetNamedPipe的WCF多个应用程序

我试图在同一台机器上运行多个WCF服务托管应用程序。

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

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

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

问候

像这样接近它会做你想要的,我相信:

 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,每次打开服务时都会更改。 从服务地址派生的是共享内存对象的名称,通过该名称,管道的实际名称将发布到潜在客户端。 有关详细信息,请参见此处

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

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

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