第二步:在WCF服务中使用TCP 协议 在基于TCP的WCF通信中,我们使用NetTcpBinding处理通信的所有细节,这些细节中也包括端口的共享。 第三步:设置 PortSharingEnabled 属性为 true 在NetTcpBinding中,定义了一个特殊的属性,PortSharingEnabled,表明是否启动端口共享机制。 你可以通过通过配置的方式来指定NetTcpBinding的PortSharingEnabled属性: <bindings> <netTcpBinding> <binding name="PortBinding" portSharingEnabled="true" /> </netTcpBinding> </bindings> 也可以通过代码方式配置绑定启用 NetTcpBinding binding = new NetTcpBinding(); binding.PortSharingEnabled = true; 该绑定隐式允许外部进程(即承载 Net.TCP 端口共享服务的
Local socket timeout was '10675199.02:48:05.4775807'” 下面是一个解决方案:当使用WCF 服务使用 netTcpBinding 时,需要在客户端代理调用方法
在本篇文章中,我们安全线相同的方式来介绍三种基于局域网的绑定,即NetNamedPipeBinding、NetTcpBinding与 NetMsmqBinding。 较之NetNamedPipeBinding,NetTcpBinding涉及安全相关的定义就要复杂一些。 Security属性返回的是一个用于设置NetTcpBinding安全的NetTcpSecurity对象。 在默认的情况下,NetTcpBinding采用Transport安全模式。 在默认的情况下,NetTcpBinding采用Windows凭证。NetTcpBinding安全相关的应用编程接口如下面的代码片断所示。
对于NetTcpBinding和NetNamedPipeBinding来说,我们可以通过属性TransactionFlow设置或者获取绑定是否支持事务流转的开关,并通过TransactionProtocol 1: public class NetTcpBinding : Binding, IBindingRuntimePreferences 2: { 3: //其他成员 4: public 下面的配置中定义了开启了transactionFlow开关的两个绑定(NetTcpBinding和WS2007HttpBinding),并将其中的NetTcpBinding的TransactionProtocol > 2: <configuration> 3: <system.serviceModel> 4: <bindings> 5: <netTcpBinding > 6: <binding name="nonTransactionalBinding" transactionFlow="true"/> 7: </netTcpBinding
在IIS7.5下配置WCF的TCP绑定经常会遇到如下问题 找不到具有绑定 NetTcpBinding 的终结点的与方案 net.tcp 匹配的基址。注册的基址方案是 [http]。 --描述绑定--> <bindings> <netTcpBinding> <binding name="netTcpBindConfig" closeTimeout= <message clientCredentialType="Windows" /> </security> </binding> </netTcpBinding baseAddresses> </host> <endpoint address="" contract="XL.Service.IWFService" binding="<em>netTcpBinding</em>
BasicHttpBinding WSHttpBinding WSDualHttpBinding NetNamedPipeBinding NetTcpBinding NetMsmqBinding None BasicHttpBinding WSHttpBinding WSDualHttpBinding NetNamedPipeBinding NetTcpBinding NetMsmqBinding None HttpClientCredentialType表示); 除了BasicHttpBinding在默认的情况下None作为客户端凭证类型(匿名客户端)之外,其它绑定的默认客户端凭证类型都是Windows; NetTcpBinding BasicHttpBinding WSHttpBinding WSDualHttpBinding NetNamedPipeBinding NetTcpBinding NetMsmqBinding None
ServiceHost(typeof(Service1))) 2: { 3: serviceHost.AddServiceEndpoint(typeof(IService1), new NetTcpBinding 在基于TCP的WCF通信中,我们使用NetTcpBinding处理通信的所有细节,这些细节中也包括端口的共享。 为此在NetTcpBinding中,定义了一个特殊的属性,PortSharingEnabled,表明是否启动端口共享机制。 1: public class NetTcpBinding : Binding, IBindingRuntimePreferences 2: { 3: // ... ... 4: public bool PortSharingEnabled { get; set; } 5: } 如何我们以代码的方式进行服务的寄宿的话,我们仅仅需要将终结点的NetTcpBinding
10: Address: net.tcp://127.0.0.1/greetingservice 11: Binding: System.ServiceModel.NetTcpBinding 14: Address: net.tcp://127.0.0.1/greetingservice 15: Binding: System.ServiceModel.NetTcpBinding 从上面的例子我们可以看到,对于自动创建的四个默认终结点,如果采用基于HTTP协议的地址,则采用BasicHttpBinding作为其终结点绑定;如果地址是基于TCP协议的,作为终结点绑定的则为NetTcpBinding 10: Address: net.tcp://127.0.0.1/greetingservice 11: Binding: System.ServiceModel.NetTcpBinding 14: Address: net.tcp://127.0.0.1/greetingservice 15: Binding: System.ServiceModel.NetTcpBinding
> <binding name="<em>NetTcpBinding</em>_IMyService" closeTimeout="00:01:00" openTimeout=" > </bindings> <client> <endpoint address="net.tcp://localhost:8081/" binding="<em>netTcpBinding</em>" bindingConfiguration="<em>NetTcpBinding</em>_IMyService" contract="IMyService" name="<em>NetTcpBinding</em>_IMyService " bindingConfiguration="<em>NetTcpBinding</em>_IMyService" contract="IMyService" name="<em>NetTcpBinding</em>_IMyService" behaviorConfiguration="NewBehavior">这一句,增加了behaviorConfiguration="NewBehavior
而对于NetTcpBinding来说,如果采用Transport安全模式,并且采用非Windows认证(客户端凭证类型选择None或者Certificate),最终的传输安全的实现也是基于TLS/SSL 举个例子,对于如下的配置,终结点采用NetTcpBinding绑定,并且选择Transport安全模式,但是却采用匿名的认证方式(客户端凭证类型为None)。 该实例会涉及两种不同的绑定类型(WS2007HttpBinding和NetTcpBinding)和寄宿方式(自我寄宿和IIS寄宿)。 从配置中我们可以看到:寄宿的CalculatorService服务唯一的终结点使用了Transport模式的NetTcpBinding绑定。该绑定的客户端凭证类型为None,意味着接受匿名客户端。 > 2: <configuration> 3: <system.serviceModel> 4: <bindings> 5: <netTcpBinding> 6
contract="Part4.ICompanyPublicService"></endpoint> <endpoint address="CompanyService" binding="<em>netTcpBinding</em> binding name="BasicHttpBinding_ICompanyPublicService" /> </basicHttpBinding> <netTcpBinding > <binding name="<em>NetTcpBinding</em>_ICompanyConfidentialService" /> </netTcpBinding " bindingConfiguration="NetTcpBinding_ICompanyConfidentialService" contract ="CompanyService.ICompanyConfidentialService" name="NetTcpBinding_ICompanyConfidentialService">
四、NetTcpBinding 到此为止,我们一共介绍了三种类型的绑定。 它们基于不同的传输协议,我们先来介绍基于TCP传输协议的NetTcpBinding。 我们照例采用列出绑定元素列表的方式分析绑定的特性,我们先通过下面的代码看看一个采用默认构造函数创建的NetTcpBinding对象会包含哪些绑丁元素。 System.ServiceModel.Channels.TcpTransportBindingElement 除了对传输安全模式的支持(默认),NetTcpBinding也提供对消息安全模式提供支持 不过与WsHttpBinding的实现机制不同的是,基于NetTcpBinding是采用TCP协议固有的可靠传输机制,比如消息确认机制、重发机制等等。
三、NetTcpBinding和NetNamedPipeBinding 我们按照之前的方式来分析另外两个只要应用于局域网环境中的两个绑定,即NetTcpBinding和NetNamedPipeBinding 但是对于NetTcpBinding和NetNamedPipeBinding来说,如果采用Transport安全模式,最终的绑定元素集合还和采用的认证方式有关。 1: NetTcpBinding binding = new NetTcpBinding(SecurityMode.Transport); 2: binding.Security.Transport.ClientCredentialType 也就是说Mixed模式下的NetTcpBinding总是采用TLS/SSL实现Transport安全。 换句话说,如果你使用Mixed模式下的NetTcpBinding,你必须为服务指定一个X.509证书作为服务的凭证。
host.AddServiceEndpoint(typeof(Server.IData), basicHttpBinding, address); //再来一个netTcpBinding Binding netTcpBinding = new NetTcpBinding(); address = ""; host.AddServiceEndpoint(typeof(Server.IData), netTcpBinding, address); //开始服务 ((IChannel)proxy).Close(); //换TCP绑定试试 Binding tcpBinding = new NetTcpBinding
contract="HelloService.IHelloService"></endpoint> <endpoint address="HelloService" binding="<em>netTcpBinding</em> <binding name="BasicHttpBinding_IHelloService" /> </basicHttpBinding> <netTcpBinding > <binding name="<em>NetTcpBinding</em>_IHelloService" /> </netTcpBinding> " bindingConfiguration="NetTcpBinding_IHelloService" contract="HelloService.IHelloService " name="NetTcpBinding_IHelloService"> <identity>
将绑定换成netTcpBinding 服务端配置 <bindings> <netTcpBinding> <binding name="<em>NetTcpBinding</em>_IService" 绑定配置变换为: <netTcpBinding> <binding name="<em>NetTcpBinding</em>_IService" maxBufferSize="79360" maxReceivedMessageSize ="79360" transferMode="Streamed"/> </netTcpBinding> 客户端配置: <netTcpBinding> <binding name="<em>NetTcpBinding</em>_IService 修改客户端配置为: <<em>netTcpBinding</em>> <binding name="NetTcpBinding_IService" sendTimeout="00:00:10" transferMode ="Streamed"/> </netTcpBinding> ?
接下来我们需要将这个普通的服务移植Host到IIS上, 第一.首先需要更改web.config文件,将服务配置为net.tcp绑定 配置文件如下: 代码 <system.serviceModel> <bindings> <netTcpBinding protectionLevel="EncryptAndSign" /> <message clientCredentialType="Windows" /> </security> </binding> </netTcpBinding service behaviorConfiguration="MyBehavior" name="WCFService.Service1"> <endpoint address="" binding="<em>netTcpBinding</em>
由于双工通信依赖于一个双工的信道栈,即依赖于一个能够支持双工通信的绑定,在此我们选用了NetTcpBinding,Mono下的wsDualHttpBinding 是不支持的哦,具体可以参看 http:/ = "duplexnetTcpBinding"> <security mode ="None" /> </binding> </netTcpBinding v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration> 注: 在WCF预定义绑定类型中,WSDualHttpBinding和NetTcpBinding 而NetTcpBinding完全基于支持双工通信的TCP协议。 代码下载 相关文章: 我的WCF之旅(3):在WCF中实现双工通信 Mono WCF Advent Day 11: NetTcpBinding Using WCF Callback Services Throttling
> 2: <configuration> 3: <system.serviceModel> 4: <bindings> 5: <netTcpBinding NetTcpBinding & ListenUriMode.Explicit--> 19: <endpoint address="net.tcp://127.0.0.1 <em>NetTcpBinding</em> & ListenUriMode.Unique--> 22: <endpoint address="net.tcp://127.0.0.1: NetTcpBinding & ListenUriMode.Unique & Port Sharing--> 26: <endpoint address="net.tcp 的第4个终结点,通过使用一个可用的端口(1119)确保监听地址的唯一性;而对于通过采用了<em>NetTcpBinding</em>的第5个终结点,由于采用了端口共享,不能改变其端口,所以仍然采用添加GUID后缀的方式确保监听地址的唯一性
MyService.Service1" behaviorConfiguration="MyBehavior"> <endpoint address="" binding="<em>netTcpBinding</em> //127.0.0.1:9999/Service1"); serviceHost.AddServiceEndpoint(typeof (IService1), new NetTcpBinding 然后为Service1添加了两个终结地,基于HTTP的BasicHttpBinding和基于TCP的NetTcpBinding。添加的两个终结点均采用相对地址Service1。 </endpoint> <endpoint address="Service1" binding="<em>netTcpBinding</em> maxReceivedMessageSize="67108864" transferMode="Streamed"/> </basicHttpBinding> <netTcpBinding