【发布时间】:2015-03-03 00:58:25
【问题描述】:
我在 Windows 服务中托管了一个 WCF 服务。我正在使用 NetTcpBinding 将 WPF 客户端应用程序连接到该服务。我有一个回调合同,允许将通知推送回客户端,它工作得很好,除非在同一台机器上运行多个客户端(例如,两个客户端实例在单独的远程桌面会话中运行)。在这些情况下,似乎只有一个客户端正在接收回调消息。似乎问题是由两个客户端暴露相同的回调地址引起的,因此消息仅发送到其中一个侦听器。
例如,假设我的 WCF 服务托管在机器“fakeserver”上,并且 2 个 WPF 客户端都在机器“fakeclient”上运行。客户端用于连接 WCF 服务的地址是“net.tcp://fakeserver:1234/MyService”。两个客户端都能够很好地连接到服务。但是当服务器发送回调时,它会发送到 'net.tcp://fakeclient:1234/MyCallback' (由于 NetTcpBinding 默认是双工的,我们不必指定单独的端口来发送回调),它有两个不同的客户端监听流量。这些客户端中只有一个接收到该消息。
如果我使用 WSDualHttpBinding,我将能够为客户端回调地址指定不同的端口,从而使两个客户端回调地址唯一。不过,就目前而言,我相信两个客户端回调地址是相同的,这就是为什么消息只发送到一个客户端(通常是最后一个注册的客户端)。
如何确保在同一台机器上的两个(或多个)WPF 客户端被区别对待,并且每个客户端在仍然使用 NetTcpBinding 的同时接收服务推送的任何回调消息?
【问题讨论】:
-
我很困惑。你是说你在服务上存储了两个回调委托实例,每个客户端一个,你一个接一个地调用它们,但只有一个客户端接收到调用?
-
是的,汤姆,这是正确的。当一个新的客户端会话开始时,我让它在服务中注册。该服务存储回调代理,当它需要通知所有客户端时,它会循环通过代理以广播消息。但是,当我在同一台机器上有两个客户端时,消息只会发送到一个客户端,而不是两个客户端。
-
只需在同一个会话中启动不同的客户端实例。为什么这需要跨远程会话工作?
-
Tom,请看我更新的示例。
标签: c# wcf callback nettcpbinding