我正在尝试在同一台机器上运行多个 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,每次打开服务时都会更改。从服务地址派生的是共享内存对象的名称,管道的实际名称通过该对象发布给潜在客户。 See here for more details.
关于c# - 使用 NetNamedPipe 的 WCF 多个应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5326262/