wcf系列 binding的使用(1)


文转自http://www.cnblogs.com/huangxincheng/archive/2011/10/23/2221845.html

作为WCF速成系列,只介绍些项目开发中常用到的实战知识。

学习wcf,还是对其中的几个术语要了解一下。wcf中有一个ABC的概念,就是

           第一: "A" 是地址,就是告诉别人我wcf在何处。

第二: "B"是绑定,就是告诉别人应该走什么路才能过来。

第三: "C"是契约:就是告诉别人我wcf这里有哪些东西。

项目开发中常用到的三种绑定:

          第一:wsHttpBinding,  这个binding可以认为是webservice的加强版WSE,设计的目的就是用于异构系统的交互(比如java)。

          第二:netTcpBinding,   这个binding可以认为是remoting的加强版,设计的目的就是用于不同机器的.net 程序交互,

          第三: netMsmqBinding,  这个binding可以认为是msmq的加强版本,设计目的就是脱机环境下不同机器的.net程序交互,确保信息不丢失。

     

下面对前二种binding的实际代码运用。

第二步: 既然”C"已经出来了,那么她必须要有承载她的环境,也就是所谓的“宿主”。这里用console来承载。

                 新建console程序。

  第三步:现在服务处于预开启状态,为了让wcf更加灵活,更加容易控制,就要将相关配置写入到config里面。

              在console类库中新建一个config文件,最后运行console程序正式启动。代码图如下:

    <!--定义客户端元数据类型-->
<behaviors>
<serviceBehaviors>
<!--配置名称-->
<behavior name="wsHttpBindingExample.MyserviceBehavior">
<!--客户端是否支持HttpGet方式获取数据-->
<serviceMetadata httpGetEnabled="true" />
<!--客户端是否能捕获异常-->
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>

<!--数据配置-->
<!--name就是服务名称,behaviorConfiguration:服务要暴露元数据 -->
<service
behaviorConfiguration="wsHttpBindingExample.MyserviceBehavior"
name="wsHttpBindingExample.Myservice">

<!--address:就是告诉wcf的地址是基地址baseAddresses,这个地方可以定义相对地址和决定地址-->
<!--binding:该wcf走的协议是http协议wse-->
<!--contract:就是契约内容-->
<endpoint
address=""
binding="wsHttpBinding"
contract="wsHttpBindingExample.IMyservice">
<!--定义服务器类型-->
<!--<identity>
<dns value="localhost" />
</identity>-->
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<!--二个用途:第一:这个地址用于给客户端作为服务引用的地址-->
<!--二个用途;第二,做为endpoint的基地址存在-->
<add baseAddress="http://localhost:8732/Design_Time_Addresses/wsHttpBindingExample/Myservice/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>

最后:  wcf已经开启,正在监视着address,然后我们就是先建一个console的Client程序,“引用”中“点击右键”添加服务引用。

客户端应用代码:

     如果大家看懂了wsHttpBinding如何使用,那么改成netTcpBinding将会是轻而易举。 因为只要修改两个地方即可。

           第一:修改配置文件中的endpoint地址。

       为了配置大文件传输我们需要重新定义bindings

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<!--定义客户端元数据类型-->
<behaviors>
<serviceBehaviors>
<!--配置名称-->
<behavior name="wsHttpBindingExample.MyserviceBehavior">
<!--客户端是否支持HttpGet方式获取数据-->
<serviceMetadata httpGetEnabled="false" />
<!--客户端是否能捕获异常-->
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<!--数据配置-->
<service
behaviorConfiguration="wsHttpBindingExample.MyserviceBehavior"
name="netTcpBindingExample.ManFly">

<!--address:这个地址是绝对地址用的协议netTcp协议传输-->
<!--binding:该wcf走的协议是netTcpBinding协议-->
<!--contract:就是契约内容-->
<endpoint
address=""
binding="netTcpBinding"
contract="netTcpBindingExample.IFly"
bindingConfiguration="netTcpBindConfig"
/>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>

<host>
<baseAddresses>
<!--二个用途:第一:这个地址用于给客户端作为服务引用的地址-->
<!--二个用途;第二,做为endpoint的基地址存在-->
<add baseAddress="net.tcp://localhost:8735/Design_Time_Addresses/netTcpBindingExample/ManFly/" />
</baseAddresses>
</host>

</service>

</services>

<!--定义netTcpBinding协议为主-->
<!--如果想传输大文件,下面几个配置也是必不可少的:

  maxBufferPoolSize="2147483647 "

  maxBufferSize="2147483647 "

  maxReceivedMessageSize="2147483647 "
1、closeTimeout指定完成关闭操作提供的时间间隔、默认值为一分钟
2、hostnameComparisonMode指定用于分析的Http主机名比较模式 默认值为StrongWildcard
3、listenBacklog指定侦听器伤等待接受的最大通道数
4、connectionTimeout 属性限制客户端在引发连接异常之前将等待连接的时间。默认值为 10
5、maxBufferPoolSize一个整数,指定此绑定的最大缓冲池大小,默认是512*1024字节
6、maxBufferSize正整数,指定内存中用于存储消息的存储区的最大大小(字节)
如果 transferMode 属性等于 Buffered,则此属性应等于 maxReceivedMessageSize 属性值。
如果 transferMode 属性等于 Streamed,则此属性不能大于 maxReceivedMessageSize 属性值,应当至少为标头的大小。
默认值为 65536
7、maxConnections整数指定服务将创建/接受的最大出站和入站连接数。传入和传出连接分别根据此属性指定的限制进行计数。默认值为10
8、maxReceivedMessageSize正整数,指定采用此绑定配置的通道上可以接受的最大信息大小,包括信息头,如果消息超出此限制则发送方将收到 SOAP 错误。接收方将删除该消息,并在跟踪日志中创建事件项。默认值为 65536
9、name一个包含绑定的配置名称的字符串。因为此值用作绑定的标识,所以它应该是唯一的。.net4.0;里面就没自动配置了
10、openTimeout指定完成打开操作提供的时间间隔
11、portSharingEnabled一个布尔值,指定是否为此连接启用 TCP 端口共享。如果此值为 false,则每个绑定都使用自己的独占端口。此设置只与服务相关,因为客户端不受影响。
12、receiveTimeout一个 TimeSpan 值,指定为完成接收操作提供的时间间隔。此值应大于或等于 Zero。默认值为 00:10:00
13、sendTimeout一个 TimeSpan 值,指定为完成发送操作提供的时间间隔。此值应大于或等于 Zero。默认值为 00:01:00
14、transactionFlow一个布尔值,指定绑定是否支持流动 WS-Transactions。默认值为 false
15、transactionProtocol指定与此绑定一起使用的事务处理协议。有效值为OleTransactions WSAtomicTransactionOctober2004 默认值为 OleTransactions。此属性的类型为 TransactionProtocol。
16、transferMode一个 TransferMode 值,指定为请求或响应对消息进行缓冲处理还是流式处理。
-->
<bindings>
<netTcpBinding>
<binding
name="netTcpBindConfig"
closeTimeout="00:01:00"
openTimeout="00:1:00"
receiveTimeout="00:10:00"
sendTimeout="00:01:00"
transactionFlow="false"
transferMode="Buffered"
listenBacklog="10"
maxBufferPoolSize="2147583647"
maxBufferSize="2147483647"
maxConnections="10"
maxReceivedMessageSize="2147483647"
>

<readerQuotas maxDepth="32"
maxStringContentLength="2147483647 "
maxArrayLength="2147483647 "
maxBytesPerRead="4096"
maxNameTableCharCount="16384" />

<reliableSession ordered="true"
inactivityTimeout="00:10:00"
enabled="false" />

<security mode="Transport">
<transport
clientCredentialType="Windows"
protectionLevel="EncryptAndSign" />
</security>
</binding>
</netTcpBinding>
</bindings>

</system.serviceModel>
</configuration>

至此我已经安装此博友的第一篇文章进行了汇总

原文地址:https://www.cnblogs.com/zhijianliutang/p/2248090.html