WCF-TcpBinding端口共享

在同一台机器上一个端口在某时刻只能被一个端口占用。对于WCF服务来说,如果服务器上有多个服务并且这些服务寄宿在不同的应用程序中,我们需要某种途径来共享它们的端口。下面是一个示例来演示使用TcpBinding进行端口共享。在VS2010中创建两个WCF服务工程,使用TCP绑定并且使用同一个端口进行部署。

工程1代码如下:

using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
namespace hostTcpPortSharing2
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host2 = new ServiceHost(typeof(mywcf.CalculatorService));
            NetTcpBinding tcpbind = new NetTcpBinding();
            host2.AddServiceEndpoint(typeof(mywcf.ICalculatorService), tcpbind, "net.tcp://localhost:8899/tcp1");
            host2.Opened += delegate { Console.WriteLine("net.tcp://localhost:8899/tcp1 Service Start!"); };
            host2.Open();
            Console.ReadLine();
        }
    }
}

工程2代码:

using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
namespace hostTcpPortSharing2
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host2 = new ServiceHost(typeof(mywcf.CalculatorService));
            NetTcpBinding tcpbind = new NetTcpBinding();
            host2.AddServiceEndpoint(typeof(mywcf.ICalculatorService), tcpbind, "net.tcp://localhost:8899/tcp2");
            host2.Opened += delegate { Console.WriteLine("net.tcp://localhost:8899/tcp2 Service Start!"); };
            host2.Open();
            Console.ReadLine();
        }
    }
}

这两个工程代码基本一致,相同点就是都用了NetTcpBinding,并且都部署到8899端口,唯一不同的是终结点地址。先运行工程1,再运行工程2。

端口已经被工程1占用,工程2无法使用。

WCF对服务的端口共享提供了支持方法。在端口共享服务开启的状态下,当两个使用同一个端口的服务Open的时候,会注册到Net.Tcp共享服务中。注册内容为匹配地址-宿主进程。当客户端调用的时候会根据请求中的终结点地址转发到对应的服务进程。开启Tcp端口的方法很简单,只需要在TcpBinding的PortSharingEnabled属性设置为true即可。注意,工程1和工程2都需要设置。代码如下:

NetTcpBinding tcpbind = new NetTcpBinding();
tcpbind.PortSharingEnabled = true;
host.AddServiceEndpoint(typeof(mywcf.ICalculatorService), tcpbind, "net.tcp://localhost:8899/tcp1");
NetTcpBinding tcpbind = new NetTcpBinding();
tcpbind.PortSharingEnabled = true;
host.AddServiceEndpoint(typeof(mywcf.ICalculatorService), tcpbind, "net.tcp://localhost:8899/tcp2");

如果用配置文件的方式则为:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="tccpbind" portSharingEnabled="true"></binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service name="mywcf.CalculatorService">
        <endpoint address="net.tcp://localhost:8899" binding="netTcpBinding" bindingConfiguration="tccpbind" contract="mywcf.ICalculatorService"></endpoint>
      </service>
    </services>
  </system.serviceModel>
</configuration>
时间: 2024-10-10 06:24:20

WCF-TcpBinding端口共享的相关文章

调试wcf服务端口号自动变化的解决办法

调试调用wcf服务时报错,更新wcf服务时会发现端口号自动变了,比方说现在的端口号是54861: http://localhost:54861/XLTWCFService.svc 端口号会变成其他数字,于是就会报错.原因是WCFservice项目被设置成了自动分配端口号,解决办法如下: 右键WCFservice项目,选择属性(Properties) 进去后在web项下面找到Service,把Auto-assign Port(自动分配站点)切换成specific port,端口号记下来,这里为54

求关注 wcf bindipendpointdelegate 端口限制的功能

我最近也需要实现一个功能:1)一个客户端(192.168.0.15),10个服务端(提供A接口.B接口)如下:      192.168.0.1-5685       192.168.0.2-5685      192.168.0.3-5685       .......2)在客户端通过httpwebrequest循环遍历向10个服务端调用接口,先调用A接口,再调用B接口: 想要实现效果: 1.因为客户现场的端口是有限制的,未开发Any端口,因此客户端发送的http请求的端口必须未固定的(560

WCF基础之传输

WCF中使用的主要传输的方式有HTTP,TCP和命名管道. 绑定包括可选的协议绑定元素(如安全),必需的编码绑定元素和必须的传输协定绑定元素三个部分,而由传输方式则是由传输绑定元素来决定的. HTTP是客户端与服务器之间的一个请求/响应协议,不是基于连接的(即不需要建立通信会话),如果通信双方都是WCF,则建议使用TCP和命名管道通信. TCP是与HTTP相反,它是基于连接的,且TCP提供可靠传输(TCP通知发送方开始传递包,保证按发送时同样的顺序传递这些包,传输丢失的包和确保数据包不重复),W

wcf精通1-15

随笔- 197  文章- 0  评论- 3407 十五天精通WCF——第一天 三种Binding让你KO80%的业务 转眼wcf技术已经出现很多年了,也在.net界混的风生水起,同时.net也是一个高度封装的框架,作为在wcf食物链最顶端的我们所能做的任务已经简单的不能再简单了, 再简单的话马路上的大妈也能写wcf了,好了,wcf最基本的概念我们放在后面慢慢分析,下面我们来看看神奇的3个binding如何KO我们实际场景中的80%的业务场景. 一:basicHttpBinding 作为入门第一篇

Web端口复用正向后门研究实现与防御

0×01背景 现在的很多远控/后门因为目前主流防火墙规则的限制,基本上都采用TCP/UDP反弹回连的通讯形式:但是在较高安全环境下,尤其负责web相关业务的环境,因为安防设备(防火墙,IDS,IPS等)规则的严格限制,TCP/UDP(HTTP/HTTPS/DNS)甚至ICMP等隧道都不能很轻易从内网访问Internet,只接受外部的请求.在这种场景下,攻击者在拿到了webshell的前提下,考虑植入除webshell以外的后门就需要考虑如何来绕过防火墙等安防设备的限制了. 实际上关于端口复用这一

IIS 中托管基于TCP绑定的WCF服务

IIS 中托管基于TCP绑定的WCF服务 一.创建一个基于TCP绑定的WCF服务 1.创建一个的简单的服务具体代码如下 服务契约定义 namespace SimpleService { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IHelloService”. [ServiceContract] public interface IHelloService { [OperationContract] string GetMessage(string m

十五天精通WCF——第五天 你需要了解的三个小技巧

一: 服务是端点的集合 当你在开发wcf的时候,你或许已经注意到了一个service可以公布多个endpoint,确实是这样,在wcf中有一句很经典的话,叫做“服务是端点的集合",就 比如说一个普普通通的服务,它就公布了一个服务端点,一个元数据端点,对吧... 仔细一想,这个问题就好玩了,既然一个service可以公布多个endpoint,而且我还知道wcf中有很多的binding,这些binding对应着很多的传输方式,那是不是 说我一个service可以用多种协议方法对外公布,比如说同时以n

WCF z

终结点与服务寄宿 由于最近可能要使用WCF做开发,开始重读蒋金楠的<WCF全面解析>,并整理个人学习WCF的笔记. 蒋金楠的书是我的第一本WCF入门书,虽说硬着头皮啃下来了,但是原理内容太多太多,没有长期的经验是无法掌握的,而且这本书写得太过于偏重原理,并不是一本稍微看看就能速成并实现工作需求的书. 于是这篇文章的目的就是把原理和类结构分析给干掉(毕竟书上都有,我何必抄书?),把一些关键话语和配置方式摘出来,以便日后一旦遇到问题有个速查的手册,也相当于为这本书做了一个索引. 不过不得不说的是,

菜鸟学习WCF笔记-Address

终结点是WCF最为核心的对象,因为它承载了所有通信功能.服务通过相应的终结点发布出来,客户端通过与之匹配的终结点对服务进行调用.终结点有地址.绑定和契约ABC三要素构成. Address  作为终结点的三要素之一地址(Address),在基于WCF通信中不仅仅用于定位服务,还提供额外的寻址信息,同时还包含着用于进行服务认证的服务身份信息. 其地址的URL规则如下: [传输协议(Scheme)]://[主机名称|域名|IP地址]:[可选端口]/请求资源 如:http://test.com:81/t