使用NetNamedPipe的WCF多个应用程序

Jas*_*ter 9 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();
Run Code Online (Sandbox Code Playgroud)

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

问候

Chr*_*son 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();
Run Code Online (Sandbox Code Playgroud)

这是因为,如果您指定使用该net.pipe方案的基地址,则该基地址用于派生侦听器使用的管道名称[请参阅下面的编辑],这在每个应用程序实例中都是相同的,因此仅第一个应用程序的监听器可以创建管道 - 其他人失败,如您所知.

在端点级别使用绝对URI,没有基地址,使用从完整绝对URI派生的管道名称创建监听器[请参阅下面的编辑],这在每个应用程序实例中都是不同的,因此每个应用程序的监听器都可以创建它拥有独特的管道没有任何问题.


编辑:更确切地说,管道名称本身并不是从服务地址派生的 - 它是一个GUID,每次打开服务时都会更改.什么从服务地址导出是通过该管道的实际名称发布到潜在客户的共享内存对象的名称.有关详细信息,请参见此处