WCF 的端口共享功能






3.42/5 (30投票s)
2007年8月8日
5分钟阅读

86947
WCF 的端口共享功能
引言
WCF(以前称为 Indigo)是 .NET 中开发分布式应用程序的下一代方式。除了从面向服务的角度进行开发并统一 Microsoft 技术栈的所有分布式技术外,它还包含各种其他可能未被重点突出或未得到充分文档化的功能。其中一项功能是通过 TCP 协议进行端口共享。出于明显的安全原因,组织会使用 NAT 和防火墙。如果需要部署并通过防火墙访问任何应用程序,则需要依赖防火墙开放的常用 TCP 端口。HTTP 协议通常使用端口 80。得益于 HTTP.sys 和 IIS 6.0 的使用,端口 80 可以被多个应用程序使用和共享,但问题在于没有一种统一的方法可以通过 TCP 实现端口共享。
如果可以在多个运行 TCP 的应用程序之间共享同一个端口,会怎么样?
答案在于 WCF 的 NET.TCP
端口共享功能。在本文中,我们将了解如何在 WCF 中轻松实现这一点。
如果 TCP 上运行的应用程序使用了相同的端口,会发生什么?
在上述应用程序中,应用程序 1 运行在 TCP 端口 2555 上,客户端 1 正在与其交互。现在,如果客户端 2 想要访问同一端口 2555 上的应用程序 2,它将遇到以下错误:
“IP 端点 <Endpoint ID> 上已存在监听器。请确保不要在应用程序中多次使用此端点,并且没有其他应用程序正在监听此端点。”
NET.TCP 端口共享
现在,通过 NET.TCP
端口共享服务,WCF 中的多个应用程序可以共享相同的端口。
|
查看上图,其逻辑在于 WCF 附带的名为 **NET.TCP Port Sharing Service** 的 Windows 服务,该服务支持 WCF 的多端口共享。
在 WCF 中,共享 TCP 上的常用端口是一个三步过程:
- 启用
NET.TCP
端口共享服务(默认禁用) - 在 WCF 服务中使用 TCP 协议
- 将
PortSharingEnabled
属性设置为true
我们将逐一介绍这些步骤。
第一步:启用 NET.TCP 端口共享服务
.NET 3.0 的安装会随之安装一系列其他服务。安装的 Windows 服务之一是 NET.TCP
Port Sharing Service。此服务允许运行在不同进程中的 WCF 服务共享同一个端口。其优点是,运行在 TCP 上的多个应用程序不再需要为每个应用程序打开单独的端口。此服务由一个名为 SMSvcHost.exe 的进程托管,该进程位于“c:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Communication Foundation”文件夹中(将 C 替换为您的 Windows 根目录)。内部而言,此进程管理已启用端口共享(在第 3 步中指定)的服务的 TCP 套接字。默认情况下,此服务处于禁用状态,需要启动。要启用它:
- 打开“运行”并键入
services.msc
。单击“确定”。 - 在服务管理控制台的“名称”列中选择
NET.TCP
Port Sharing Service。 - 启动该服务。
第二步:在 WCF 服务中使用 TCP 协议
WCF 服务只能通过其端点进行访问。端点是服务的入口点。如果 WCF 服务没有端点,.NET 编译器会给出编译时错误。端点由地址、绑定和契约组成。WCF 中的绑定决定了如何访问任何 WCF 服务。它们包含有关使用的协议、事务要求、安全要求、通信类型等信息。Microsoft 提供了预定义的绑定,大多数情况下,您的需求都可以通过这些预定义绑定得到满足。如果没有任何预定义绑定能满足您的需求,您也可以创建自定义绑定。这些绑定可以通过命令式代码或配置文件指定。其中一些预定义的绑定使用 TCP 协议,如 NetTcpBinding
和 NetPeerTcpBinding
。要通过 Net.TCP
端口共享服务使用多端口共享,请创建一个端点并使用上述 TCP 绑定之一。
要了解如何创建端点,请阅读 此链接。
第三步:将 PortSharingEnabled 属性设置为 true
<bindings>
<netTcpBinding>
<binding name="PortBinding" portSharingEnabled="true" />
</netTcpBinding>
</bindings>
上述代码是配置文件中的一个摘录。此任务可以通过命令式代码完成,通过实例化 NetTcpBinding
并将其 PortSharingEnabled
设置为 true
。
// configure a binding with TCP port sharing enabled
NetTcpBinding binding = new NetTcpBinding();
binding.PortSharingEnabled = true;
第三步是将监视 TCP 端口的任务委托给使用上述绑定的所有服务的 SMSvcHost.exe,并启用端口共享。它将因此监视该服务器上的所有 TCP 流量,并将其路由到应用程序的目标地址。因此,当使用 PortBinding
并运行在 TCP 协议上的任何 WCF 服务启动时,WCF 引擎不会直接打开端口,而是将此责任委托给 NET.TCP
端口共享服务,该服务不仅为该服务打开端口,还充当该端口的监听器。客户端无需进行任何设置调整。
摘要
SMSvcHost.exe 还包含一个名为 SMSvcHost.exe.config 的配置文件,位于同一个根目录中。此配置文件管理可能使用端口共享功能的所有进程的列表以及可以运行此 Windows 服务的用户帐户列表。运行在不同进程中的每个服务都应具有不同的 URI,即使它们共享相同的端口。此服务只能在 TCP 协议上使用,不能在 HTTP 或命名管道上使用。然而,它也为产品开发打开了机会之门,并让系统管理员松了一口气。他们不再需要为了防火墙的安全而妥协。