9

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

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

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

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

问候

4

2 回答 2

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

于 2011-03-17T10:17:47.420 回答
0

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

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

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

于 2011-03-16T14:19:34.573 回答