一、可靠性会话

Windows Communication Foundation (WCF) 可靠性会话是一个如 WS-ReliableMessaging 协议所定义的 SOAP 可靠消息传递的实现。它在绑定层保证消息只会被传送一次,并能确定消息之间的传输顺序。它的特性在于保证了传输过程中消息不会丢失或者错位,在连接掉线的时候,它会重新连接服务器,连接次数可在配置文件中设定,当在连接失败的时候,能自动释放对话所占用的资源。

系统有多个绑定支持可靠性会话功能:wsHttpBinding、wsDualHttpBinding、wsFederationBinding、netTcpBinding、netNamedPipesBinding。其中wsHttpBinding、wsFederationBinding、netTcpBinding在默认情况下可靠性会话功能是关闭。而wsDualHttpBinding、netNamedPipesBinding则默认支持可靠性功能。

二、开发实例

可靠性会话功能可以通过代码绑定,也可以通过config配置统一绑定,值得注意的是服务器端要与客户端的配置必须保持一致,避免出现冲突。下面以netTcpBinding契约为例子,说明一下可靠性会话的功能。首先建立数据契约Person,和服务契约PersonService,客户端通过GetPerson方法获取Person对象。

  • 服务器端
 1 namespace Pro.Model 2 { 3 //建立数据契约 4     [DataContract] 5 publicclass Person 6     { 7         [DataMember] 8 publicint ID 9         {10 get;11 set;12         }13 14         [DataMember]15 publicstring Name16         {17 get;18 set;19         }20 21         [DataMember]22 publicint Age23         {24 get;25 set;26         }27     }28 }29 30 namespace Pro.Service31 {32 // 建立服务契约接口“IPersonService”。33     [ServiceContract]34 publicinterface IPersonService35     {36         [OperationContract]37         Person GetPerson();38     }39 40 // 实现服务契约“PersonService”。41     [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]42 publicclass PersonService : IPersonService43     {44 public Person GetPerson()45         {46             Person person =new Person();47             person.ID =0;48             person.Name ="Leslie";49             person.Age =31;50             51 return person;52         }53     }54 55 class Program56     {57 //启动服务58 staticvoid Main(string[] args)59         {60             Console.WriteLine("Service star!");61             ServiceHost host1 =new ServiceHost(typeof(PersonService));62             host1.Open();63             Console.ReadKey();64             host1.Close();65         }66     }67 }

添加config配置文件,加入 reliableSession 配置,包含以下属性

1.enable 

返回值为bool类型,代表是否打开可靠性功能。

2.inactivityTimeout 

返回值为TimeSpan类型,代表闲置超时时间,默认值为10分钟,如果客户端已经建立起服务对象,在超过此时间内没有重新调用这些对象,系统将发送提示信息: “通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于‘出错’状态。”。

3.ordered

返回值为bool类型,代表是否开启“有序性”性功能,如果开启此功能,代表消息将按顺序传送。

4.maxPendingChannels

返回值为int 类型,代表最大等候信道,默认值为4。

5.maxRetryCount

返回值为int 类型,表示最大重复发送次数,默认值为8,最大值为20。如果因断线等原因连接失败,客户端重试次数超过此最大值,系统将发出错误提示。

6.flowControlEnabled

返回值为bool类型,默认值为true,代表是否启动流量控制器。启动后,当接收方的传输数据缓冲区已满时,发送方将延迟发送信息。

7.acknowledgementInterval

返回值为TimeSpan类型,默认值为00:00:00.2(即0.2秒),代表接收方在接收信息之前所需要的等待时间。

8.maxTransferWindowSize

返回值为int类型,默认值为8,用于控制数据缓冲区数量。

 1 <configuration> 2 <system.serviceModel> 3 <behaviors> 4 <serviceBehaviors> 5 <behavior name=""> 6 <serviceMetadata httpGetEnabled="false"/> 7 <serviceDebug includeExceptionDetailInFaults="true"/> 8 </behavior> 9 </serviceBehaviors>10 </behaviors>11 12 <bindings>13 <netTcpBinding>14 <binding name="defaultNetTcpBinding">15 <!--打开可靠性会话功能,把过期时间配置为10秒-->16           <reliableSession enabled="true" inactivityTimeout="00:00:10"/>17 </binding>18 </netTcpBinding>19 </bindings>20 21 <services>22 <service name="Pro.Service.PersonService">23 <!--绑定defaultNetTcpBinding-->24 <endpoint address="" bindingConfiguration="defaultNetTcpBinding" binding="netTcpBinding" contract="Pro.Service.IPersonService">25 <identity>26 <dns value="localhost"/>27 </identity>28 </endpoint>29 <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>30 <host>31 <baseAddresses>32 <add baseAddress="net.Tcp://localhost:6000/Pro.Service/PersonService/"/>33 </baseAddresses>34 </host>35 </service>36 </services>37 </system.serviceModel>38 </configuration>

在以上例子中,只在netTcpBincding绑定中加入了enable与inactivityTimeout两个最常用的功能,其意义只在于打开可靠性会话功能,把超时时间设置为10秒(定制10秒的超时时间,其用意是在于测试在10秒后再次调用服务对象,对象是否会抛出错误提示)。

  • 客户端

新建一个网站项目,添加对PersonService服务的引用,在页面加入一个Label控件与一个Button控件,在Button的onClick方法调用PersonService服务。

<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"><title></title><script type="text/C#" runat="server">protectedvoid btn1_Click(object sender, EventArgs e)        {//注意在调用完成后把服务销毁using (PersonService.PersonServiceClient personService =new PersonService.PersonServiceClient())            {                Pro.Model.Person person = personService.GetPerson();                Label1.Text = person.Name;            }        }</script></head><body><form id="form1" runat="server"><div><asp:Label ID="Label1" runat="server"></asp:Label><asp:Button ID="btn1" runat="server"  Text="Button"  OnClick="btn1_Click"/></div></form></body></html>

配置客户端文件,打开可靠性会话功能,注意把超时时间设置为10秒,与服务器的配置同步。在常用的服务处理页面,使用单体模式或者静态对象,在一定程序上可以减少服务器的负荷,提高效率。值得注意的是,如果使用单体模式,当服务启动10秒后,如果并未被再次调用,那下次调用时,系统将显示错误信息:“通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于‘出错’状态”。所以,在配置“超时时间”时,应该注意控制时间的长短。

为了避免出现以上错误,在下建议在调用不经常使用的服务之时,应该把服务对象及时销毁,下次调用时重新建立一个服务对象。(可参考“注意事项”)

 1 <configuration> 2 <system.web> 3 <compilation debug="true" targetFramework="4.0"/> 4 </system.web> 5 <system.serviceModel> 6 <bindings> 7 <netTcpBinding> 8 <binding name="NetTcpBinding_IPersonService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00"                       sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"                       hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288" maxBufferSize="65536"                       maxConnections="10" maxReceivedMessageSize="65536"> 9 <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>10 <!--启动可靠性会话,把过期时间设置为10秒-->11                     <reliableSession inactivityTimeout="00:00:10" enabled="true"/>12 <security mode="Transport">13 <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>14 <message clientCredentialType="Windows"/>15 </security>16 </binding>17 </netTcpBinding>18 </bindings>19 <client>20 <endpoint address="net.tcp://localhost:6000/Pro.Service/PersonService/" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IPersonService" contract="PersonService.IPersonService" name="NetTcpBinding_IPersonService">21 <identity>22 <dns value="localhost"/>23 </identity>24 </endpoint>25 </client>26 </system.serviceModel>27 </configuration>

三、注意事项

值得注意的一点是,在某些不常用到的页面中(比如在Login登录页面),客户往往在长时间内只调用一次服务,所以应该注意对服务对象进行及时销毁,否则客户再次登录时就会出来错误。

 1 <html xmlns="http://www.w3.org/1999/xhtml"> 2 <head runat="server"> 3 <title></title> 4 <script type="text/C#" runat="server"> 5 static PersonService.PersonServiceClient personService =new PersonService.PersonServiceClient(); 6 //只在页面初次调用时,personService才会被新建,如果超过限时没有被再次调用,就会出现错误 7        8 protectedvoid btn1_Click(object sender, EventArgs e) 9         {10             Pro.Model.Person person = personService.GetPerson();11             Label1.Text = person.Name;12         }13 </script>14 </head>15 <body>16 <form id="form1" runat="server">17 <div>18 <asp:Label ID="Label1" runat="server"></asp:Label>19 <asp:Button ID="btn1" runat="server"  Text="Button"  OnClick="btn1_Click"/>20 </div>21 </form>22 </body>23 </html>

相关文章

简单的WCF开发实例

使用AJAX+WCF进行页面开发

共享数据契约

可靠性会话功能

自定义绑定

对JAVA与.NET开发有兴趣的朋友欢迎加入QQ群:162338858

cnblogs博客园:http://www.cnblogs.com/leslies2/
csdn博客:http://blog.csdn.net/leslies2
原创作品,转载时请注明作者及出处

WCF揭秘——可靠性会话功能相关推荐

  1. 《WCF揭秘》:欢迎大家来找我的茬!

    <WCF揭秘>:欢迎大家来找我的茬! <WCF揭秘>一书自今年8月份出版以来,无论是在网上书店,还是在专业技术社区,都获得了读者的高度评价. 虽然今年图书市场不景气,但是这本书 ...

  2. window10使用 Hyper-V 创建ubuntu虚拟机并使用增强会话功能

    要点就是:使用快速安装hyper-V推荐的ubuntu,不要用自己的系统.下面的是我的采坑过程,可省略. 缘由:本想在小米Air笔记本上通过VBOX安装虚拟机,安装完VBOX后,正准备安装ubuntu ...

  3. 【腾讯开放平台】Android、IOS实现指定QQ临时会话功能

    腾讯开放平台提供了WPA接口,能够实现对于普通用户,无需加其好友就能和其发起临时会话(但是对于400开头的企业QQ号,如Mob平台的企业QQ:4006852216 ,必须先加其好友才能实现临时会话), ...

  4. 使命必达: 深入剖析WCF的可靠会话[编程篇](上)

    在<实例篇>给出的例子中,我实际上是通过对终结点的绑定进行相应的配置让整个消息的交换过程在一个可靠会话中进行,进而实现可靠消息传输的目的.由于整个可靠会话的机制是完全在信道层实现的,而整个 ...

  5. csgo客服端文件与比赛服务器,B5全新客户端功能大揭秘 自定义比赛功能篇

    B5对战平台从创立伊始便立志成为国内专业的CS:GO对战平台,因此B5签约了国内众多职业战队也举办了很多CS:GO比赛,不管是职业玩家还是民间大神都可以在B5对战平台找到自己的归宿.然而有很多玩家和裁 ...

  6. c#进阶(5)—— WCF 实现简单预订功能

    1.WCF概述 WCF全称为Windows Communication Foundation,在.Net 3.0 中引入,用于客户端与服务端通信,替换了之前的一些技术,如.Net Remoting 及 ...

  7. WCF揭秘学习笔记(5):WF定制活动

    WF(Windows Workflow Foundation,Windows工作流基础)为.NET提供了一种基于模型的.声明方式的过程执行引擎,它改变了传统的通过一行行编写代码来开发服务功能的方式. ...

  8. 细说WCF中的会话模式

    大家都知道WCF会话模式有几个要求:1.会话契约:2.绑定支持:3.实例模式为PerSession.这几个要素是WCF支持的必要条件. 会话契约:由服务端提供实现,客户端调用时只持有契约定义,所以需要 ...

  9. 微信7.0.16 for iOS测试版新增隐藏会话功能

    在使用微信时,因为各种各种的原因,你可能不想见到与某个人的聊天会话一直出现在列表里,或者不想其他人看到,但是又不得不面对它时刻就在那里的烦恼.因为一旦将其从聊天会话列表中删除,该聊天的所有消息记录也会 ...

最新文章

  1. [JS] 题解:提取不重复的整数
  2. tcpdump抓包分析具体解释
  3. mysql workbench 1064_MySQL Workbench:查询错误(1064):第1行“ VISIBLE”附近的语?mysql-问答-阿里云开发者社区-阿里云...
  4. 怎么在谷歌浏览器中安装.crx扩展名的离线Chrome插件?
  5. access阿里云 mysql_access数据库如何使用
  6. vue使用a标签下载文件
  7. Matlab系列教程_数值计算_求方差和标准差
  8. jsp汽车4S店维修管理系统
  9. [附源码]java毕业设计卡通动漫商城系统
  10. CATIA二次开发—API梳理
  11. Android打开系统自带文件管理器,全选菜单选项
  12. 屏幕增强字段如何保存修改记录
  13. XP系统常用的登录密码方法破解(一共9种)
  14. 如何将页脚固定在页面底部,而不是屏幕底部!
  15. Python中Dataframe通过print输出多行时显示省略号
  16. 小米门卡协议加载失败_小米手机门禁卡空白卡开通步骤及写入激活方法
  17. python如何安装pil库_Python安装PIL库
  18. 猿创征文 | Shell编程【上篇】
  19. 02_java基础语法
  20. 置信度和置信度区间理解

热门文章

  1. java版本号分段比较_java 实现比较版本号功能
  2. mysql template sql_SpringBoot-JdbcTemplates-MySQL
  3. 用户计算机安全管理,关于加强用户计算机安全管理工作的通知
  4. 多边形交叉区域计算面积_用什么算法来找到多边形与圆之间的交叉区域?
  5. pytorch dropout代码解读
  6. Tensorflow2.0数据和部署(一)——基于浏览器的模型与TensorFlow.js
  7. 手撕深度学习框架,原理很简单
  8. 医疗知识图谱NLP项目,实体规模4.4万,实体关系规模30万
  9. MySQL笔记 4月记
  10. 实用网站 |懒人爱学习