`
varsoft
  • 浏览: 2483871 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

[原创]WCF后续之旅(14):TCP端口共享

阅读更多

在基于TCP/IP协议簇的对等网络通信下,相互通信的应用程序运行各自的进程中,出于应用层的进程将数据局封装成数据报,并通过传输层的TCP或者UDP进行网络通信。而TCP和UPD则通过一个16bit的端口来识别不同的应用程序。

对于一些常用网络服务,他们都有一个知名的端口好与之匹配。比如,FTP服务是用的TCP端口为21;Telnet服务的TCP端口为23等等。而对于客户端通常对所使用的端口并不关心,只需要保证端口在本机是唯一的就可以了,这样的端口又成为临时端口,临时端口一般在1024到5000之间。

一般来讲,在某一个时刻,一个端口只能供一个应用程序使用。对于WCF来说,当我们通过一个托管的应用程序对某个服务进行寄宿的时候,一个端口被该应用程序独占使用。如何多个寄宿进行使用相同的端口

在下面的例子中,我通过两个不同的控制台应用程序对两个服务,Service1和Service2进行寄宿,两个服务的终结点地址共享相同的端口:9999

   1: using(ServiceHost serviceHost = new ServiceHost(typeof(Service1)))
<!--CRLF-->
   2: {
<!--CRLF-->
   3:        serviceHost.AddServiceEndpoint(typeof(IService1), new NetTcpBinding(), "net.tcp://127.0.0.1:9999/service1");
<!--CRLF-->
   4:        serviceHost.Open();
<!--CRLF-->
   5:        Console.Read();
<!--CRLF-->
   6: } 
<!--CRLF-->
   1: using(ServiceHost serviceHost = new ServiceHost(typeof(Service2)))
<!--CRLF-->
   2: {
<!--CRLF-->
   3:        serviceHost.AddServiceEndpoint(typeof(IService2), new NetTcpBinding(), "net.tcp://127.0.0.1:9999/service2");
<!--CRLF-->
   4:        serviceHost.Open();
<!--CRLF-->
   5:        Console.Read();
<!--CRLF-->
   6: } 
<!--CRLF-->

当我们先后运行这两个服务寄宿应用程序,第一个能够正常运行,但是对于第二个,则会抛出如下一个AdressAlreadyInUseException异常,错误信息为:

IP 终结点 127.0.0.1:9999 上已有侦听器。请确保未在应用程序中多次尝试使用该终结点,并确保没有其他应用程序在侦听该终结点。

TCP Port Sharing2

在本节中,我们将介绍如何解决这种端口被某一个应用程序独占使用的问题,让不同的监听程序能够共享同一个端口。在这之前,我们需要了解一下,端口的共享具有什么现实的意义。

一、 端口共享在WCF中的意义何在?

在一般的网络环境中,尽可能避免网络攻击,都会通过防火墙将绝大部分的端口封掉,仅仅保留那些常用的网络服务所用的端口,或者为某一个类应用保留少量的端口。总而言之,我们不能保证每个跨防火墙通信的应用都具有一个唯一的端口,他们只能共享一个或者少量的几个端口。

对于Intranet内部,为了保证部署于局域网内的其他计算机的网络应用能够与本机进行正常通信,通常会在本机的防火墙中预留一个可用的端口。Intranet内部的主机之间可以使用这些预留的端口通过相应的传输协议,比如TCP、HTTP、Named Pipe等等,进行通信。而对于处于Internet和本地网络之间的防火墙,通常仅仅只有保留80端口,保证基于HTTP的网络通信能够正常进行。

所以,无论是基于Intranet还是Internet,无论是采用何种传输协议,端口共享——让多个网络应用程序使用相同的端口进行通信,都具有重要的现实意义。

对于WCF来讲,当我们将某个服务寄宿于一个进程中,实际上就是通过该进程监听和处理来自客户端的Socket请求。在一般情况下,一个端口被一个监听进行独占使用,也就是说,如何你的主机上部署了若干服务,而这些服务寄宿于不同的应用程序中,对于这种寄宿应用程序来说,监听的端口必须不同。

所以,我们需要通过特殊的途径实现基于WCF寄宿的端口共享。对于采用不同的传输协议,我们有不同的解决方案,对于HTTP协议,我们可以通过IIS的寄宿方式实现端口的共享,对于TCP,.NET Framework3.0提供了一个特殊的Windows服务,Net.TCP Port Sharing Service,帮助我们轻松的实现端口的共享。我们接下来就讨论这种端口共享解决方案。

二、Net.TCP Port Sharing Service

从功能上讲,Net.TCP Port Sharing Service实现了和HTTP.SYS相同的功能:请求的监听和分发(request listening and dispatching)。唯一不同是,HTTP.SYS运行在内核模式(Kernel Mode)下,而Net.TCP Port Sharing Service运行在用户模式(User Mode)下。

WCF对Net.TCP Port Sharing Service提供了原生的支持。Net.TCP Port Sharing Service在WCF的实现原理如下图所示:在Net.TCP Port Sharing Service开启的状态下,如果我们通过两个服务寄宿应用程序分别寄宿两个服务,Service1和Service2,并且它们共享一样的监听端口:8888。实际上,当ServiceHost的Open方法被执行的时候,WCF会将这两个地址,net.tcp://artech.com:8888/service1和net.tcp://artech.com:8888/service2注册到Net.TCP Port Sharing Service中。而对于Net.TCP Port Sharing Service来说,在其内部维护者一个目的地址和进程的列表,在进行目的地址注册的时候,会将这两个地址和对应的服务寄宿地址的匹配关系添加到该列表之中。

当我们的服务客户端,proxy1和proxy2,分别调用service1和service2。当基于他们各自服务调用的socket连接请求抵达artech.com的时候,Net.TCP Port Sharing Service会截获请求消息,并获取目的地址。根据该目的地址,结合内部维护的目的地址和目标进程匹配列表,Net.TCP Port Sharing Service得到对应的目标应用程序,并将请求消息向真正的目标程序进行转发。

TCP Port Sharing

三 、基于TCP端口共享的编程

由于WCF下基于TCP的端口共享是建立在Net.TCP Port Sharing Service Windows服务上的。所有安装有.NET Framework3.0的操作系统都具有该Windows服务,但是在默认的情况下,该服务是不可用的。当你第一次使用Net.TCP Port Sharing Service,或者发现该服务被禁用,你需要手工的启用该服务。

注:通过“开始”-〉“控制面板”-〉“管理工具”-〉服务,打开如下图所示的“服务对话框”,然后定位到Net.TCP Port Sharing Service。

在基于TCP的WCF通信中,我们使用NetTcpBinding处理通信的所有细节,这些细节中也包括端口的共享。为此在NetTcpBinding中,定义了一个特殊的属性,PortSharingEnabled,表明是否启动端口共享机制。

   1: public class NetTcpBinding : Binding, IBindingRuntimePreferences
<!--CRLF-->
   2: {
<!--CRLF-->
   3:       // ... ...
<!--CRLF-->
   4:       public bool PortSharingEnabled { get; set; }
<!--CRLF-->
   5: } 
<!--CRLF-->

如何我们以代码的方式进行服务的寄宿的话,我们仅仅需要将终结点的NetTcpBinding上将该属性设为True就可以了:

   1: using(ServiceHost serviceHost = new ServiceHost(typeof(Service1)))
<!--CRLF-->
   2: {
<!--CRLF-->
   3:       NetTcpBinding binding = new NetTcpBinding();
<!--CRLF-->
   4:       binding.PortSharingEnabled = true;
<!--CRLF-->
   5:       serviceHost.AddServiceEndpoint(typeof(IService1),binding,"net.tcp://127.0.0.1:9999/service1");
<!--CRLF-->
   6:       serviceHost.Open();
<!--CRLF-->
   7:       Console.Read();
<!--CRLF-->
   8: } 
<!--CRLF-->

当然,你也通过通过培植的方式来指定NetTcpBinding的PortSharingEnabled属性:

   1: <configuration>
<!--CRLF-->
   2:     <system.serviceModel>
<!--CRLF-->
   3:         <bindings>
<!--CRLF-->
   4:             <netTcpBinding>
<!--CRLF-->
   5:                 <binding name="portSharingBinding" portSharingEnabled="true" />
<!--CRLF-->
   6:             </netTcpBinding>
<!--CRLF-->
   7:         </bindings>
<!--CRLF-->
   8:         <services>
<!--CRLF-->
   9:             <service name="Artech.WcfServices.Services.CalculateService">
<!--CRLF-->
  10:                 <endpoint binding="netTcpBinding"   bindingConfiguration="portSharingBinding"
<!--CRLF-->
  11:                     contract="Artech.WcfServices.Contracts.ICalculate" />
<!--CRLF-->
  12:             </service>
<!--CRLF-->
  13:         </services>
<!--CRLF-->
  14:     </system.serviceModel>
<!--CRLF-->
  15: </configuration>
<!--CRLF-->

分享到:
评论

相关推荐

    WCF Net.TCP 端口共享示例

    多个WCF服务共享同一个TCP端口提供服务的示例,本示例完整可用!

    WCF之旅:一个简单的WCF程序(vs2010源码)

    **WCF之旅:一个简单的WCF程序** ...总结,WCF之旅是一个从零开始接触和学习WCF的好起点,通过实践一个简单的程序,你可以了解到服务的创建、配置、调用等基础操作,为后续深入学习WCF和其他相关技术打下坚实的基础。

    Wcf Tcp绑定测试代码

    在这个配置中,我们定义了一个名为“tcpBindingExample”的TCP绑定,启用了端口共享(portSharingEnabled="true"),并设置了安全模式为“Transport”,客户端凭证类型为“None”。 三、“TcpBindingTest”实例解析...

    tcptrace TCP端口监听工具 TCP跟踪

    TCP跟踪工具,如tcptrace,是网络诊断和调试中不可或缺的工具,尤其在处理WCF(Windows Communication Foundation)和SOAP(Simple Object Access Protocol)等服务时。它们可以帮助开发者深入了解网络通信过程,找...

    tcptrace TCP端口监听工具

    5. **日志输出**:tcptrace支持将分析结果导出为文本或HTML格式的日志,方便后续分析和共享。 **在WCF调试中的应用** WCF是微软推出的一种面向服务的架构,用于构建分布式应用程序。在开发和优化WCF服务时,tcp...

    WCF 我的WCF之旅示例代码

    在这个“WCF我的WCF之旅示例代码”中,我们可以看到一系列逐步进阶的代码示例,这些示例有助于理解WCF的核心概念和技术。 首先,我们要了解WCF的基本组成部分: 1. **服务**:服务是WCF中的核心元素,它定义了对外...

    我的WCF之旅:计算器 WCF样例源代码

    我的WCF之旅- 创建一个简单的WCF程序 - Artech WCF入门之选绝佳的例子 代源源于:《WCF全面解析 上》 编程工具:VS2010 语言:C# blog 《IIS站点中部署 WCF项目》

    tcpTrace WCF小例子

    6. **配合其他工具**:TCPTrace可以与其他诊断工具,如Wireshark、Fiddler等结合使用,提供更全面的网络诊断视图。 在实际操作中,可能会遇到一些挑战,比如解析复杂的XML数据,或者在大量数据流中查找关键信息。...

    基于TCP协议的WCF调用简单程序

    本项目聚焦于“基于TCP协议的WCF调用简单程序”,它涉及到服务的构建、自定义宿主托管以及客户端调用等核心概念。下面我们将深入探讨这些知识点。 首先,**WCF(Windows Communication Foundation)**是.NET ...

    WCF和TCP消息通信练习

    3. **绑定和终结点设置**:配置WCF服务,选择TCP作为传输方式,并设置监听的IP地址和端口。这通常在服务的配置文件(Web.config或App.config)中完成。 ```xml binding="netTcpBinding" contract=...

    我的WCF之旅源代码 IIS寄宿

    **WCF之旅源代码——IIS寄宿与泛型序列化** Windows Communication Foundation(WCF)是微软.NET框架中用于构建分布式应用程序的服务模型。在这个源代码包中,我们聚焦于两个核心概念:IIS(Internet Information ...

    我的WCF之旅源代码_创建一个简单的WCF程序

    **WCF(Windows Communication Foundation)**是微软.NET框架下的一个组件,用于构建、配置和部署服务。它提供了统一的编程模型,支持多种通信协议和数据格式,如HTTP、TCP、MSMQ等,使得服务可以跨平台、跨网络进行...

    WCF TCP 源码下载实例

    本教程将通过“WCF TCP 源码下载实例”深入讲解如何在WCF中使用TCP作为传输通道来实现服务通信。** ### WCF简介 WCF是一种全面的服务模型,它集成了.NET Framework中的多种通信技术,如ASMX、.NET Remoting、WS*等...

    我的WCF之旅后续篇

    我的WCF之旅后续篇,呀,要大于20字符啊,废话一下

    WCF框架的http和tcp demo

    **WCF框架详解** Windows Communication Foundation (WCF) 是微软.NET Framework中的一种全面的服务开发框架,它为构建、部署和管理分布式应用程序提供了统一的编程模型。WCF支持多种通信协议和传输方式,其中包括...

    WCF 关于TCP/IP的通信

    在本主题中,我们将深入探讨WCF如何利用TCP/IP协议进行通信,这是WCF服务间交互的基础。 TCP(Transmission Control Protocol)/IP(Internet Protocol)是互联网上最广泛使用的网络通信协议栈,提供了端到端的可靠...

    WCF tcp协议示例Model

    在这个"WCF tcp协议示例Model"中,我们将会探讨如何使用WCF构建基于TCP协议的服务端和客户端。 服务端创建: 1. **配置服务**:首先,我们需要定义服务合同(Service Contract),这是一个接口,声明了服务提供的...

    WCF net.Tcp

    - **TCP复用**:多个服务可以共享一个TCP连接,减少网络资源消耗。 - **安全特性**:内置SSL/TLS支持,可实现端到端的安全通信。 - **压缩**:可选择性地启用压缩,进一步减小数据传输量。 - **服务质量(QoS)**:...

Global site tag (gtag.js) - Google Analytics