2

我计划将 wsDualHttpBinding 用于带有回调的 WCF 服务。客户端将是通过 Internet 与服务通信的 Windows 窗体应用程序。显然我无法控制客户端的防火墙,所以我想知道在客户端设置 ClientBaseAddress 的正确方法是什么?

现在在我的初始测试中,我在同一台电脑上运行服务和客户端,我正在设置绑定如下

Dim binding As System.ServiceModel.WSDualHttpBinding = Struct.Endpoint.Binding
binding.ClientBaseAddress = New Uri("http://localhost:6667")

但是我感觉这在通过 Internet 部署时不起作用,因为“localhost”不会转换为机器地址(更不用担心 NAT 转换)并且该端口可能被客户端防火墙阻止。

处理远程客户端回调的基地址的正确方法是什么?

有人告诉我,如果我没有指定 ClientBaseAddress,那么 WCF 基础设施会在端口 80 处创建一个默认客户端基址,用于来自服务的传入连接。由于端口 80 通常对防火墙开放,因此应该可以正常工作。

所以只要告诉我win form wcf客户端应用程序何时运行然后我如何打开我的自定义端口,如“6667”,并指导我应该使用什么库或什么方法,结果响应应该来自客户端路由器到电脑和防火墙不会阻止任何东西。请与现实生活场景讨论这个问题人们如何在现实生活中处理这种情况。谢谢

4

1 回答 1

4

正确的方法是使用 TCP 传输而不是 HTTP 传输。HTTP 上的双工通信需要两个 HTTP 连接——一个从客户端打开到服务器(没关系),第二个从服务器打开到客户端。这仅适用于您可以完全控制两端的情况。仅仅通过猜测要使用的地址就无法避免太多的复杂情况,例如:

  • 必须配置本地 Windows 或第三方防火墙
  • 应用程序运行权限 - 默认情况下不允许监听 HTTP,除非 UAC 已关闭或应用程序以管理员身份运行。您必须允许通过 netsh 或 httpcfg(Windows XP 和 2003)监听端口——这又需要管理员权限。
  • 端口可能已被另一个应用程序使用。在 80 的情况下,任何本地 Web 服务器都可以使用它 - 例如 IIS。
  • 专用网络和网络设备 - 如果您的客户端计算机位于 NAT 之后,则必须配置端口转发,但是如果您有两台计算机在同一个专用网络上运行您的应用程序怎么办?您不能从同一个传入端口转发到两台机器。

只有当您可以控制整个基础架构时,才能避免所有这些问题。这就是为什么 HTTP 双工通信主要用于 Intranet 方案的原因,以及为什么例如 Silverlight 提供另一种实现,其中不创建第二个连接,Silverlight 客户端而是连续轮询服务器以检查是否有任何可用的回调。

TCP 传输只需要从客户端到服务器的单个连接,因为 TCP 协议本身是双工的,因此服务器可以通过相同的连接回调客户端。当您部署公共服务时,您通常可以控制服务器端的基础架构,以便您可以对配置进行必要的更改以使其正常工作。

我想这也回答了你之前的问题

于 2013-01-07T11:54:28.857 回答