几天前,有朋友在QA上问有关WCF中可信赖会话(ReliableSession)的问题。今天重新梳理一下,主要目就是真正的弄清楚可信赖会话的作用,方法和现实意义。
正如那位的疑惑一样,很多做过WCF开发的朋友,也都对ReliableSession不太理解。查阅msdn,可以发现ReliableSession是System.ServiceModel命名空间下的一个类。主要的作用如下所述:
提供对可靠会话绑定元素属性的便捷访问,这些属性是在使用系统提供的绑定之一时提供的。 |
包括两个重要的属性(Property)成员:
1.InActivityTimeout
文档中的说明是:获取或设置服务在关闭之前保持非活动状态的时间间隔。
说白了一点呢,就是如果服务停留多长时间没有工作,那我们就关闭他(嘿嘿,有点像公司对待员工一样,偶 尔休息一下子,不干活还行,时间长了,老板会炒你鱿鱼的哦!)
2.Ordered
文档中说明为:获取或设置一个值,该值指示消息传递是否必须保持与消息发送一致的顺序。
任何一方,无论是客户端发送请求消息(Request Message),还是服务端发送相应消息(Response Message)。发送出来的消息都有先后次序,而接收方在接收这些消息的时候,有时候会出现错位的现象,有的消息可能后发先至,而有的可能先发后至,这就影响了通讯双方正常的交互。产生这样现象的主要的原因有两点:
1)未使用可靠连接协议,使得在传输层中出现类似现象
2)虽然试用了可靠连接协议,但在发送端或者接收端的通道中(Channel)发送或者接收有顺序问题
tcp协议用于解决第一个问题,而ReliabelSession的Ordered正可以解决第二个问题。
在WCF的缺省绑定中,只有以下几种支持或者默认打开了ReliableSession的功能,他们为:
wsHttpBinding
wsDualHttpBinding
wsFederationHttpBinding
netTcpBinding
其中netTcpBinding,wsHttpBinding,wsFederationHttpBinding中的ReliableSession属性均是RelibaleSession的一个派生类型,名为OptionRelibaleSession,也就是提供了可选的功能。相比ReliableSession,OptionReliableSession仅仅多了一个属性:Enabled,用这个属性可以指示是否开启可信会话。true代表开启,false的话就不开启了,那么对InActivityTimeout和Ordered的设置将无效。这里面wsHttpBinding和wsFederationHttpBinding其实都继承自wsHttpBindingBase,所在在讨论ReliableSession的时候,这两个Binding表现一致。而对与wsDualHttpBinding则默认的将ReliableSession属性的Ordered设置为了true.也就是说wsDualHttpBinding是缺省支持可信会话的。而ReliableSession的InActivityTimeout默认情况是是10分钟。
在上面对ReliableSession的描述中,我们可以清楚的看到便捷描述的字样。这是怎么一回事情呢?原来ReliableSession这个class并没有缺省的构造函数,而只是有一个接收ReliableSessionBindingElement类型的构造,这就引出了相比更重要的角色:ReliableSessionBindingElement. 下面就来说说它,并说说它和ReliableSession之间,和Binding之间有着怎样的联系
ReliableSessionBindingElement:
BindingElement的一个派生类,也就是说它是一个绑定元素。熟悉WCF架构或者读过大侠Artech<<WCF后续之旅>>的朋友,应该知道WCF的Foundation是如何的。不知道的也没有关系,我也来说说大概,WCF暴露给外界的是终结点(EndPoint),在WCF基础部门,一个终结点又有主要的三部分组成:1)地址 (Address) 2) 绑定Binding3) 契约 (Contract),也就是传说中的"ABC",呵呵。地址相对比较简单,契约是用于WCF框架留给开发人员创建具体业务逻辑代码的地方,而WCF中,最核心,也是最具有魅力的地方就在于Binding.对于Bind的认识可以帮助我们更清楚的解析WCF的一些特征。一个Binding会维护一个BindElement的集合,这个在Binding的派生类CustomBinding中作为Elements属性来表示,Elements是一个Collection<BindingElement>的类型。在Elements中的每个BindingElement都有着各自的功能,比如在NetTcpBinding中,就存在这这样的一种BindingElement组织方法
处于第一个位置的是TransactionFlowBindingElement,如果支持ReliableSession的话,那么ReliabelSessionElement就处于NetTcpBinding中的第二个位置 ,如果不支持ReliableSession,则此元素将存在,紧接着的是SecurityBindingElement,随后是BinaryMessageEncodingBindingElement用于消息编码,随后是用于通讯安全的Element,它的类型由NetTcpSecurity属性来决定。最后是TcpTransportBindingElement.而且需要注意的是,每一个Binding中,最后一个Element必须都为TransportBindingElement。在上面的所谈论到的BindingElement中,各自都有各自的功能,他们各司其职,Binding只是将他们紧密的组织在了一起。但每个BindingElement是不是真正的执行者呢?NO!他也是一个组织者,他组织的对象主要有两个:
ChannelFactory
ChannelListener
其中ChannelFactory是作为客户端使用的,而ChannelListener是作为服务端时候使用的。不幸的是,无论是ChannelFactory还是ChannelListener,也都不是真正的执行者,他们是IChannel的工厂类。真正在里面辛勤劳动的还是实现了IChannel的Channel对象。至于说ChannelFactory和ChannelListener是如何组织Channel的,和Channel的一些具体行为,篇幅有限,不再赘述。为了给大家一个详细的认识,画了几幅图:

接下来,我们分别放大终结点,将终结点的详细构造用图形表达出来:

BindingElement管理两个对象ChannelFactory和ChannelListener
这一级的表示图如下:

上面说了这么多有关WCF基础架构的(Infrastructor)的,下面返回再来看ReliableSessionElement,首先我们就会从宏观上理解它了,它就是一个类型的BindingElement,它包含如下的主要属性成员:
InActivityTimeout
Ordered
MaxRetryCount
上面的几个重要属性中,InActivityTimeout和Ordered两个属性和ReliabelSession的作用是一致的。而MaxRetryCount用于如果指定了使用可信通道,也就是Ordered为True的时候,当可信通道没有收到消息的时候,通过在基础通道上调用Send方法重发此消息的次数
ReliabelSession是ReliableSession的一种快捷表示,原因是在构造Binding的时候的,会首先构造一个ReliableSessionElement对象,然后将这个对象的引用传递给ReliableSession对象,这样其实ReliableSession对象其实就是ReliableSessionElement对象中的一部分数据,只是由于暴露ReliabelSessionElement给开发人员,有些不优雅,所以单独设计了这么一个ReliableSession的类,用于快捷表示ReliableSessionElement.
好了,从理论上讲,我所认识的ReliableSession说的差不多了。下面借鉴一个有趣的实例来检验一下ReliableSession到底有何作用。使用它和不使用它有何异同。
这个试验的构思来源于WindowsCommunicationFoundation Unleashed<<WCF揭秘>>一书。传说中,这个示例的构思来自于WCF项目经理Shy Cohen.他的思路是将1张图片分成100分,每一份作为一个消息发送给接受者,接受者在根据接收到的消息产生绘制图像。而在发送的过程中,通过插入一个自定义的BinddingElement,将数据分概率的截取下来不予发送。这时候,如果不采用ReliableSession,那么接收方收到的图像是不完整的。有一小部分缺失,而如果采用了ReliableSession呢,那尽管发送的时候,在被拦截的时候的当此发送中,消息的确没有发出去,但基础通道会尝试进行重发,重发的包有很小几率会再次被拦截,如果再次被拦截,那么会再次重发,那么被拦截的几率会更小,这时候接受者收到的是完整的图像。
在Shy Cohen的试验中,由三个组件构成:
发送者(Sender)
接受者 (Receiver)
对照者 (Router)
他们之间的关系如图:

对照者能够指定发送者漏包的比率,比如1%,10%等,发送者与对照者之间一直使用的是没有可靠连接的会话,试验的步骤是:
1)首先将接受者和发送者都设置为不接受可信赖会话。设置的方法就是将各自config中的添加<reliableSession Ordered="false"/>。此时,运行三个程序,在对照者中调整丢包频率,在发送者中选择一幅图片,注意:最好是它例子中给定的Seattle.jpg,因为其他图片可能因为过大,而造成异常。选择图片之后,点击发送。此时,在对照者和接受者中会显示出接收到的包数目,丢失的数目,和发送的数目。如果设置的比率比较大的话,会发现接受者所形成的图像有明显缺失。对照者中的丢包数目也大于0
通过这一步骤,可以得出结论,如果没有采用可信会话,消息在发送的过程中是有可能丢失或者错位的,尽管我们使用的是Tcp协议
2)将接受者和发送者config中的配置更改为<reliableSession Ordered="true"/>,此时,再次选择图片,发送,会发现在偶尔的几次中,发送操作进行的非常迟钝,但发送完成之后,接受者的图像是完整的,而对照者仍然存在着一些丢失的消息。
相关推荐
本文将深入探讨如何在WCF中实现自定义会话,以及如何利用`IsInitiating`和`IsTerminating`属性来控制会话的创建和销毁。 首先,理解会话的基本概念非常重要。在WCF中,会话是一种机制,它允许服务端保存关于客户端...
在WCF中,会话(Session)是一种重要的概念,它允许服务与客户端之间建立持续的、有状态的通信。本篇将深入探讨WCF的三种会话方式,以及它们在不同实例模式下的应用,并分析实例、会话和通信协议的组合效果。 ### 1...
在WCF中,**会话实例化和并发**是两个关键概念,它们对服务的行为和性能有着深远影响。 **会话(Session)**在WCF中是指在客户端和服务之间建立的一系列相互关联的消息交换。它提供了上下文的连续性,允许服务跟踪...
3. **绑定**:绑定是WCF中定义通信方式的配置,它决定了数据如何在客户端和服务之间传输。常见的绑定有BasicHttpBinding、WSHttpBinding、NetTcpBinding等,每种绑定支持不同的安全、可靠性及性能特性。 4. **合同*...
在IT行业中,Windows Communication Foundation(WCF)是微软提供的一种用于构建分布式应用程序的服务框架,它支持多种通信协议和模式,包括双向(双工)通信。本文将深入探讨如何利用C#实现一个WCF服务,并创建一个...
总结,`MessageContract`在WCF中提供了一种强大且灵活的方式,用于定义和操作消息格式。无论是服务端还是客户端,通过正确地实现和使用`MessageContract`,都可以精确控制服务之间的通信,以满足复杂的业务需求。在...
### WCF中应用泛型 #### 一、泛型概念的理解与重要性 在软件开发领域,特别是面向对象编程中,泛型是一种重要的编程技术,它允许开发者编写一种类型的代码来处理不同的数据类型,从而提高了代码的复用性和灵活性。...
在VB6中访问WCF(Windows Communication Foundation)服务是一项技术挑战,因为VB6不直接支持WCF的现代通信协议。然而,通过使用一些特定的工具和技术,如Soap Toolkit 3.0,我们可以实现这一目标。以下是一些关于...
- **服务接口和实现**:定义了WCF服务的接口以及其实现,这些接口定义了可供客户端调用的操作。 - **配置文件**:可能包含`app.config`或`web.config`,用于配置WCF服务的行为,如绑定、终结点、行为等。 - **客户端...
本文将详细介绍WCF(Windows Communication Foundation)端口测试工具及其在开发过程中的重要性,同时结合C#编程语言、WCF服务以及.NET Framework 4的相关知识,为开发者提供一套全面的测试和学习资源。 WCF是...
首先,我们来看标题中提到的“WCF中使用泛型效果示例”。在WCF服务中,泛型可以帮助我们创建灵活的服务操作,例如`GetEntity(int id)`方法。这个方法定义了一个泛型参数`T`,并限制它必须继承自`EntityBase`类,其中...
在WCF中,服务是主要的工作单元,它们可以通过多种协议和传输方式暴露接口。服务契约定义了服务的行为,即服务可以提供什么操作。数据契约定义了服务之间交换的数据结构。绑定定义了服务如何与客户端通信,包括使用...
本文档主要针对WCF中的可靠消息传输机制进行了深入探讨,特别是其在第五章中详细阐述的可靠会话(Reliable Sessions)。 #### 二、可靠消息传输的重要性 在网络通信中,确保消息能够被正确、完整地传递至关重要。然而...
在.NET框架中,Windows Communication Foundation(WCF)是一种用于构建分布式应用程序的服务模型,它提供了统一的方式来进行跨进程、跨网络的通信。WCF服务可以被各种类型的客户端访问,包括WinForms应用程序。本...
在WCF中,服务是提供功能的实体,可以通过一个或多个终结点暴露其操作。服务可以通过配置文件或者代码来定义,可以支持多种传输协议、消息编码和地址格式,具有高度的灵活性和可扩展性。 三、终结点 终结点是服务与...
在标题和描述中提到的“WCFService可以通过web调用和WCF服务访问”,这意味着该服务已经配置为允许两种不同的调用方式。 1. **Web调用**:WCF服务可以通过HTTP协议暴露为Web服务,允许任何支持SOAP协议的客户端进行...
在WCF中,事务(Transaction)是一个关键概念,它确保一系列操作要么全部成功,要么全部失败,以此来维护数据的一致性。本项目以银行转账为例,展示了如何在WCF服务中实现事务处理。 **银行转账**是一个典型的涉及...
在WCF中,服务实例的创建和管理由实例化策略控制,常见的实例化策略有: - **单例(Singleton)**: 服务在整个生命周期内只创建一个实例,所有请求都共享同一实例。 - **会话实例(PerSession)**: 每个新的客户端...
总之,《Windows Communication Foundation Unleashed》第四章详细介绍了WCF中用于提高系统健壮性的关键技术——可靠会话、会话管理、队列交付和事务流。通过理解和应用这些技术,开发人员可以构建出更加可靠和稳定...
Windows Communication Foundation(WCF)是微软.NET Framework中的一个核心组件,用于构建高度可配置、安全且可靠的分布式应用程序。WCF整合了多种.NET早期版本中的通信技术,如ASP.NET Web服务、Remoting、MSMQ和...