我正在尝试在同一台计算机上运行多个 WCF 服务托管应用程序。
我想运行多个应用领域- 不在一个应用程序中提供多项服务。
var host = new ServiceHost(typeof(MyClass1), new Uri[] { new Uri("net.pipe://localhost") });
host.AddServiceEndpoint(typeof(ISomeInterface), new NetNamedPipeBinding(), "FOO");
host.Open();
我为每个应用程序更改“FOOD”,但仍然无法启动多个服务。
我猜这很简单,但我卡住了:(
Regards
我相信,这样处理就会达到你想要的效果:
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,每次打开服务时都会更改。什么is从服务地址派生的是共享内存对象的名称,通过该名称将管道的实际名称发布给潜在的客户端。请参阅此处了解更多详细信息。 http://blogs.charteris.com/blogs/chrisdi/archive/tags/Named+Pipes/default.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)