net.tcp协议共享tcp端口的功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了net.tcp协议共享tcp端口的功能相关的知识,希望对你有一定的参考价值。
参考技术A Windows Communication Foundation (WCF) 为高性能通信提供新的基于 TCP 的网络协议 (net.tcp://)。 WCF 还引入了一个新的系统组件,即 Net.TCP 端口共享服务,该组件使 net.tcp 端口可以在多个用户进程之间共享。背景和动机
刚开始引入 TCP/IP 协议时,只有少量应用程序协议使用它。 TCP/IP 通过为每一个应用程序协议分配一个唯一的 16 位端口号,从而使用端口号来区分应用程序。 例如,HTTP 通信现在已经统一为使用 TCP 端口 80,SMTP 使用 TCP 端口 25,FTP 使用 TCP 端口 20 和 21。 其他使用 TCP 作为传输协议的应用程序可以按习惯或遵循正式标准选择其他可用的端口号。
可使用端口号区分存在安全问题的应用程序。 除少数几个已知的入口点之外,防火墙通常会配置为阻塞 TCP 通信,因此,部署使用非标准端口的应用程序经常会因为存在公司防火墙和个人防火墙而变得复杂或者甚至无法实现。 通过已得到允许的标准已知端口进行通信的应用程序可减少外部攻击面。 许多网络应用程序使用 HTTP 协议,这是因为大多数防火墙在默认情况下会配置为允许 TCP 端口 80 上的通信。
在 HTTP.SYS 模型中,许多不同的 HTTP 应用程序的通信中将多路复用到单个 TCP 端口。此模型已经成为 Windows 平台上的标准。 这为防火墙管理员提供了一个公共控制点,同时可以让应用程序开发人员尽可能降低生成可利用网络的新应用程序的部署成本。
在多个 HTTP 应用程序之间共享端口的能力早已成为 Internet 信息服务 (IIS) 的一个功能。 但是,只有在引入 IIS 6.0 附带的 HTTP.SYS(内核模式 HTTP 协议侦听器)之后,此基础结构才完全得到广泛使用。 实际上,HTTP.SYS 允许任意用户进程共享专用于 HTTP 通信的 TCP 端口。 此功能可以让许多 HTTP 应用程序在同一台计算机上共存于不同的独立进程中,同时共享通过 TCP 端口 80 发送和接收通信所需要的网络基础结构。 Net.TCP Port Sharing Service 支持为 net.tcp 应用程序共享相同类型的端口。
如何配置net.tcp 的WCF服务
1部署IIS1.1安装WASIIS原本是不支持非HTTP协议的服务,为了让IIS支持net.tcp,必须先安装WAS(WindowsProcessActivationService),即windows进程激活服务。打开控制面板--程序和功能--打开或关闭windows功能,安装WAS,安装完毕后在Services窗口中可以到到如下服务:WindowsProcessActivationService;Net.MsmqListenerAdapter;Net.PipeListenerAdapter;Net.TcpListenerAdapter;Net.TcpPortSharingService.这几个服务。确定Net.TcpListenerAdapter与Net.TcpPortSharingService是否已经启动。1.2确定WCF是否启用Non-Http支持同样是在控件面板中打开这个功能1.3给站点添加net.tcp绑定在IIS中,选中网站,然后在右边的操作菜单栏中单击绑定,会弹出一个“网站绑定”窗口,点击添加,类型选择net.tcp1.4启用net.tcp协议选择网站,点击“高级设置”,弹出的的窗体中,在“已启用的协议”一栏中手动添加:net.tcp2测试服务2.1新建服务用VS2010新建一个WCF服务,为了简单,我就直接用VS默认生成的作测试了。只有一个GetData方法下面是配置的Config:ViewCode2.2发布服务将服务发布到IIS,在浏览器中访问服务,如果访问正常就说明服务部署成功,2.3测试服务新建一个控制台项目,测试服务。添加服务测试服务正常。3遇到的问题问题1:找不到具有绑定NetTcpBinding的终结点的与方案net.tcp匹配的基址。注册的基址方案是[http]。这可能是网站中没有启用net.tcp协议所到致,也就是少了上面的1.4.问题2:未找到URI“net.tcp://gyoung/Service1.svc/mex”的兼容TransportManager。这可能是因为使用了指向虚拟应用程序外部的绝对地址,或终结点的绑定设置与其他服务或终结点所设置的绑定设置不匹配。请注意,同一协议的所有绑定在同一应用程序中应具有相同的设置。这个问题并没有找到真正的原因,应该是binding设置的原因,原先的binding配置是:这样的话会出现上面的错误,但当我将后面四个节点去掉后,即变成:就没有报这个错误了。问题3:有没有必要绑定host地址:之前我在service节点下有增加host地址但发现这根本不起作用,因不不管我怎么设置,最后我的net.tcp地址都是上面那个,是我设置有错误?补充一点:如果你的Silverlight程序无法调用net.tcp服务,可能是你少了跨域文件:clientaccesspolicy.xml将clientaccesspolicy.xml放到IIS的根目录:C:\\inetpub\\wwwroot中,因为SL默认只访问80端口,所以要增加这个文件。 参考技术A 这个方法里,我们有两个函数,一个能够根据学生点获取学生全名,另一个是根据学生点获取学生的实体对象。好了,让我们来编译这个项目,得到一个WCFServiceGeneratedByConfig.exe文件。
然后,我们需要配置文件来让服务器端启动,所以这里我们要用WCF Service Configuration Editor
工具来进行,由于在VS2008 和VS2010中带有这个软件,我们可以直接通过菜单->Tools->WCF Service Configuration Editor来打开。
首先,点击File->New config, 打开Service的Configuration界面。
然后,点击Create a new service…,在弹出的界面中,我们选择刚才生成的那个WCFServiceGeneratedByConfig.exe文件。双击之后,软件自动显示出了里面含有的Service:
点选那个Service,然后点击两次next,我们会看到出现了选择Communation Mode的界面,这里由于我们用的是net.tcp,所以我选择了第一个:TCP。
然后点击Next,我们会看到要我们填写EndPoint,这里我随便填写了一个:
之后,点击Next知道Finish,然后,我们的最基本的配置就结束了。
回到Config界面之后,我们点击Advanced->Service Behaviors->New Service Behavior Configuration,在弹出的界面中,我们点击Add->serviceMetadata:
然后点击Add,我们就添加了一个Behavior Element。点击刚刚生成的serviceMetadata节点,在显示的界面中,设置HttpGetEnabled为true。
然后点击原来的Service节点下的Host节点,在Base Address栏目下单击Add,添加如下的Base Address:
最后点击OK。然后点击菜单File->Save As 保存到项目文件夹下即可。
这里是生成的代码:
View Code
这一步做完后,我们需要让服务能够启动,怎么启动呢?请看下面的代码:
View Code
代码中的注释部分非常重要,我们一定要添加,否则下面的步骤不能进行,具体的原因,参加我的另一篇文章:在net.tcp模式下,由SvcUtil.exe生成代理类文件和配置文件
然后运行这个ConsoleApplication。
接下来,找到SvcUtil.exe,C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\SvcUtil.exe,在CMD窗口下运行如下命令:
C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\SvcUtil.exe net.tcp://127.0.0.1:50001/StudentServiceEndPoint
这样,这个小工具就会自动的给我们生成代理类和配置文件
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation,版本 3.0.4506.2152]
版权所有(c) Microsoft Corporation。保留所有权利。
正在尝试使用 WS-Metadata Exchange 从“net.tcp://127.0.0.1:50001/StudentServiceEndPoint”下载元数据。此 URL 不支持 DISCO。
正在生成文件...
E:\WCF\WCF_ChatRoom\StudentService.cs
E:\WCF\WCF_ChatRoom\output.config
请按任意键继续. . .
客户端的配置步骤
接下来,新建一个WindowsFormsApplication程序,将这个代理类拷入,配置文件修改名称为App.config拷入,
然后在Form1.cs中拖入一个文本框,一个按钮,一个DataGridView,后台代码如下:
View Code
启动这个实例,输入学生ID,我们成功得到了服务端返回的值。
在本机和公网上的运行结果
那么能不能在公网上使用呢?呵呵,这个当然,将服务端拷贝到外网的一台机器上,然后修改服务器端的配置文件中的地址为:net.tcp://169.*.*.124:50001/ StudentServiceEndPoint,然后将本机的配置文件中的地址也修改为这个,最后运行,依然能够得到返回的结果。本回答被提问者采纳
以上是关于net.tcp协议共享tcp端口的功能的主要内容,如果未能解决你的问题,请参考以下文章
net.tcp.listen和net.tcp.port的区别
WCF net.tcp 绑定:托管多个服务是不是需要端口共享?
在从 net.tcp 协议连接到 WCF 的端点处侦听的问题