C# WCF使用NetNamedPipe的多个应用程序

C# WCF使用NetNamedPipe的多个应用程序,c#,wcf,named-pipes,netnamedpipebinding,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();

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

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

var host = new ServiceHost(typeof(MyClass1), new Uri[] { new Uri("net.pipe://localhost") });
host.AddServiceEndpoint(typeof(ISomeInterface),  new NetNamedPipeBinding(), "FOO");
host.Open();
我为每个应用程序更改“FOO”,但仍然无法启动多个服务。 我猜这很简单,但我被卡住了:(


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

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

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

像这样接近它会满足您的需求,我相信:

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,每次打开服务时都会更改。从服务地址派生的是一个共享内存对象的名称,通过该对象,管道的实际名称将发布给潜在客户。

我想运行m多个应用程序不是一个应用程序中的多个服务。如果应用程序使用多个服务合同(接口),请定义“应用程序”好吗,只要您为每个实现的接口添加端点,就可以使用具有单个主机的单个WCF服务。如果您创建了多个WCF服务,每个WCF服务都实现了不同的接口,则必须为每个服务使用单独的ServiceHost。application=process。换句话说,我希望有两个进程来承载相同的服务行政长官谈不同“地址”。我对.NET中的进程没有太多经验,但在我看来,您需要按照Matthew的建议为每个进程创建一个具有不同基址的ServiceHost对象。从WCF的角度来看,实例化多个进程听起来有些过分,因为您可以轻松地将单个服务配置为侦听不同的端点地址。我明天会看看是否能找到一个代码示例。祝你好运!这不是关于托管服务,而是关于一台机器上的IPC。