WCF net tcp端口共享

6

我有两个WCF服务,每个服务都在自己的控制台应用程序中托管。

它们托管在以下位置:

net.tcp://computername:7777/Service1
net.tcp://computername:7777/Service2

每个都有自己的合约。 我希望它们使用相同的端口,因此我在这个主题上阅读了很多内容,并执行了以下操作:
1. 启用了网络TCP端口共享服务。 2. 使用以下命令注册url`s:
netsh http add urlacl user=domain\username url=net.tcp://+:7777/Service1
netsh http add urlacl user=domain\username url=net.tcp://+:7777/Service2
3. 为每个 WCF 服务启用 PortSharingEnabled=true 绑定 4. 在单独的控制台应用程序中托管每个服务。
如果我启动两个控制台应用程序,第二个应用程序总是在调用主机的 Open() 方法时引发此异常:
    AddressAlreadyInUseException. The transport manager failed to listen on the supplied 
    URI using the NetTcpPortSharing service: the URI is already registered with the 
    service.

当我将它们都托管在同一个控制台应用程序中时,它都可以正常运行。

我的问题是:如何在每个服务都托管在自己的控制台应用程序中时使其正常工作。


我已经成功地复制了你的所有步骤,除了在Windows 7、.NET 4.5中使用命令“Registered the url's using the commands:”注册URL。 - Jon Lindeheim
看起来你已经做了端口共享所需的一切。只需仔细检查以下内容:1. 你创建了 portsharingEnabled = true 的绑定,你在 endPoint 标记(在配置文件中)中设置了 bindingConfiguration 值吗?2. 为了防止之前测试程序的设置阻止端口共享,请使用另一个端口号尝试你的程序。3. 据我所知,端口共享不需要 netsh 命令。 - Yang You
@Jon_Lindeheim 谢谢,至少我知道它应该能工作。我现在需要做的就是从头开始重新创建所有内容,并希望我犯的错误会浮出水面。我会尽快回复。 - Menahem
@yyou,感谢您抽出时间来帮助。 - Menahem
1个回答

3

正如Jon_Lindeheim和您所说的那样,这应该可以正常工作。因此,我按照以下步骤从头开始重新创建了所有内容:

我有两个WCF服务,它们具有相同的基地址和不同的相对URI
例如: 对于服务1:

    <add baseAddress = "net.tcp://computername:7777/" />
    ...
    <endpoint address = "/service1" ... />

并且针对服务2:
    <add baseAddress = "net.tcp://computername:7777/" />
    ...
    <endpoint address = "/service2" ... />  

我不知道基地址必须不同,而不仅仅是最终的绝对URI。因此,以下内容可以正常工作:对于服务1:
    <add baseAddress = "net.tcp://computername:7777/service1/" />
    ...
    <endpoint address = "/service1" ... />

服务2:

    <add baseAddress = "net.tcp://computername:7777/service2/" />
    ...
    <endpoint address = "/service2" ... />  

为什么当所有内容在一个进程中时,第一种错误的方式仍然有效,我认为这与端口共享路由流量的基于进程的方式有关。

再次感谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接