版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、BF-TECH 4.0 DNET 软件开发工程师高薪就业品牌课程版权所有:北风网,使用WCF搭建企业通用架构讲师:石曼迪,第六章:处理会话、实例化和并发,目录,会话 实例化 并发,会话:什么是会话,会话是通信双方进行通信的一个时间片、一个语境或者说一个上下文,在这个特定的环境中,通信的双方是彼此认识的,就像两个人在聊天,他们都很清楚谁在聆听自己讲话,也很清楚对方讲的话是给自己听的,简单的说就是通信双方是可以记住彼此的。 一旦会话结束了,通信双方就忘记了彼此,即使他们再次建立会话,他们也不会记得他们上次会话的内容,也就是他们不记得他们曾经见过面。 这在我们现实世界中或许很难想象,但是在通信的世界
2、里就是这样的。服务端不可能记住每个跟他通信的人,他只能在一段时间内(会话)记住一个人。 这个特性是很有用的,有些逻辑需要客户端和服务端通信多次才能完成,在这个期间双方需要记住彼此,而且会话也是很多其他特性实现的基础,例如双工通信。,会话,可以在服务协定上设置System.ServiceModel.ServiceContractAttribute.SessionMode 值 Allowed:默认,客户端可以进行连接,并选择建树会话或不建树会话 Required:所有调用(即,支撑调用的根蒂根基消息互换)都必须是同一个对话的一项目组。 NotAllowed:禁止会话,会话,ASP.NET会话和WC
3、F会话的区别:ASP.NET会话总是由服务器启动。 ASP.NET会话原来本是无序的。 ASP.NET会话提供了一种跨请求的常规数据存储机制。,会话,客户端应用程序和服务应用程序以不同方式与会话交互客户端应用程序启动会话,然后接收并处理在该会话内发送的消息。 服务应用程序可以将会话用作扩展点,以添加其他行为。通过直接使用InstanceContext或实现一个自定义实例上下文提供程序,可以做到这一点,会话,当WCF服务接受客户端会话时,默认情况下启用以下功能:通过同一用户定义的服务对象来处理WCF客户端对象之间的所有调用。 除了此实例化行为之外,不同的基于会话的绑定还会提供其他功能。,会话,系
4、统提供的会话类型System.ServiceModel.ChannelsSecurityBindingElement支持基于安全的会话,其中,两个通信端采用统一的安全对话。 System.ServiceModel.WSHttpBinding绑定(包含对安全会话和可靠会话的支持)默认情况下只使用对消息进行加密和数字签名的安全会话。 System.ServiceModel.NetTcpBinding绑定支持基于TCP/IP的会话,以确保所有消息都由套接字级别的连接进行关联。 System.ServiceModel.Channels.ReliableSessionBindingElement元素实现
5、WS-ReliableMessaging规范,并提供对可靠会话的支持。在可靠会话中,可以配置消息以按顺序传递并且只传递一次,从而使消息在对话期间即使经过多个节点也可以确保保密性。,会话:如何建立会话,(1) 需要支持会话的绑定。绑定描述了双方的通信方式,不同的绑定对会话的支持是不同的,比如basicHttpBinding是不支持会话的,而wsHttpBinding就是支持的。要建立会话通信,这个通信必须首先使用支持会话的绑定。 (2) 让服务协定支持会话,服务协定实际上就是通信的通道(见第四、五篇),让服务协定支持会话,那么就可以在这个通信通道上支持会话了。,ServiceContract(S
6、essionMode = SessionMode.Required) public interface IHelloWCF OperationContract string HelloWCF(); ,现场编程,Allowed Required NotAllowed,实例化,实例化行为(使用System.ServiceModel.ServiceBehaviorAttribute.InstanceContextModel属性进行设置)控制如何创建InstanceContext以响应传入的消息。 默认情况下,每个InstanceContext都与一个用户定义服务对象相关联,因此(在默认情况下)设置I
7、nstanceContextMode属性也可以控制用户定义服务对象的实例化,实例化,InstanceContextMode为服务端实现服务契约类的实例模式,有三种类型,分别为:PerCall:每次服务操作调用创建一次,调用完后进行销毁;PerSession:同一个会话期间创建一次,客户端代理第一次操作(IsInitiating = true)调用创建,调用代理的Close方法销毁或者调用IsTerminating服务操作销毁;Single:服务只会创建一次,服务开始时创建,服务完成时销毁,实例化:每调用实例,将服务类的ServiceBehavior属性中的InstanceContextMode
8、属性设置为PerCall来启用这种模式 在这种实例化模式下,客户端对服务方法的每一次调用,服务端都会new一个实例,方法调用结束即销毁,这种模式可能要频繁的花费创建对象和销毁对象的花销,因此性能比较差,但是每次调用后服务对象被销毁,对象所把持的资源也就被释放(如文件啦、数据库连接啦),因此伸缩性是最好的。,实例化:每会话实例,将服务类的ServiceBehavior属性的InstanceContextMode属性设置为PerSession时启用这种模式。 如果不指定,那么这个值是默认的配置。 这种模式下服务端在受到会话的第一个调用时实例化对象,直到会话关闭才销毁对象,这样减少了对象的建立和销毁
9、开销,性能有一定提升,但是在会话期间申请的资源如文件和数据库连接直到会话结束才会释放,伸缩性有所下降了。,实例化:单一实例,把服务类的ServiceBehavior属性的InstanceContextMode属性设置为Single来启用这种模式。 在这种模式下,服务类在受到首次调用的时候实例化,然后一直不销毁,直到服务宿主关闭,在这期间无论是会话连接还是非会话连接,服务端都用这个实例进行调用。这样实际上几乎没有创建和销毁对象的开销,但是如果一旦实例把持资源,则一直都不能释放,毫无伸缩性可言。,问题,大量客户端应用程序同时调用一个服务器上的服务,会不会使该服务承受不了?怎么解决?,并发,并发的含
10、义就是多个并行的操作同时作用于一个相同的资源或者对象,或者说同一个资源或者对象同时应付多个并行的请求。对于WCF的并发来说,这里将的“资源或者对象”指的就是承载服务操作最终执行的服务实例(Service Instance)。而WCF将服务实例封装在一个称为实例上下文(InstanceContext)对象中,所以WCF中的并发指的是同一个服务实例上下文同时处理多个服务调用请求。,并发,WCF提供了三种不同的实例上下模式(Per-Call、Per-Session和Single)实现了不同的服务实例上下文提供机制。 Single:服务实例是单线程的,一次只为一个客人服务; Multiple:服务实例
11、是多线程的,即同时为多个客人服务。没有任何的线程同步措施。 Reentrant:服务的对象是单线程的,一次只为一个客人服务,但是中间可以换客人,比如第一个客人上厕所了,接着为下一个客人服务,等前一个客人回来了,继续为他服务;,并发,并发的使用与实例化模式有关,在PerCall实例化过程中,与并发没有关系,因为每个消息都由一个新的InstanceContext处理,因此InstanceContext中处于活动状态的线程永远都不会超过一个。,现场编程,测试几种并发,实例上下文模式、并发模式和性能,InstanceContextMode 和 ConcurrencyMode 设置可以相互影响,因此了解
12、它们如何影响性能时,必须同时查看这两个设置。例如, 将 InstanceContextMode 设置为 PerCall 时,会忽略 ConcurrencyMode 设置。这是因为,每个客户端调用都将路由到新的服务实例,因此一次只会有一个线程在服务实例中运行。 将 InstanceContextMode 设置为 Single 时,仅创建一个服务实例,因此 ConcurrencyMode 会影响应用程序的吞吐量。 将 InstanceContextMode 设置为 Single 的原因很多,其中包括: 创建服务实例需要大量的处理工作。当多个客户端访问服务时,仅允许创建一个服务实例可以降低所需处理量
13、。 一个服务实例可以创建多个对象。将 ConcurrencyMode 设置为 Single 可以降低垃圾回收成本,因为不必为每个调用创建和销毁服务创建的对象。 通过将 ConcurrencyMode 设置为 Single,可以在多个客户端之间共享服务实例。 如果 ConcurrencyMode 和 InstanceContextMode 均设置为 Single,则一次只允许一个客户端调用通过。如果有大量客户端,这可能会导致较大的瓶颈。 将 InstanceContextMode 设置为 Single 并将 ConcurrencyMode 设置为 Reentrant 的性能特征与将 Concur
14、rencyMode 设置为 Single 时相同。这是因为,一次仅允许一个客户端线程进入服务。,实例上下文模式、并发模式和性能,InstanceContextMode 设置为 PerCall 时,将为每个客户端调用创建一个新服务实例上下文(默认情况下,这表示一个新服务实例),并在客户端调用完成时销毁该实例。由于服务实例仅在进行调用时可 用,因此在调用完成时,会释放它们可能访问的所有资源。由于为每个调用分配一个新服务实例,因此会产生一些开销。但是,由于每个客户端都获取自己的服务实 例,因此不存在同步问题。当大量客户端调用同时发生时,将创建大量的服务实例。遇此情形时,务必使服务实例仅分配其正常工作
15、所需的那些资源。 如果 ConcurrencyMode 设置为 Multiple,则多个客户端调用可以通过,但开发人员需负责手动同步对共享数据的所有访问。这意味着,一次只有一个线程可以访问共享数据,从而导致访问共享数据的所有调用顺序排队等候。这违背了将 ConcurrencyMode 设置为 Multiple 的初衷。 在 InstanceContextMode 设置为 PerCall 时,ConcurrencyMode 设置对吞吐量没有影响。每个客户端调用都获取自己的服务实例,因此每个服务实例只有一个调用到其中的线程。在 InstanceContextMode 设置为 PerSession
16、时,每个会话都获取自己的服务实例。使用 PerSession 时,必须使用支持会话的绑定。,并发:提高并发处理,修改配置文件, ,并发:提高并发处理,把原来类似这样的代码: AstroServiceClient _client = new AstroServiceClient() 改成 AstroServiceClient _client = new AstroServiceClient(new Random().Next(1, 4).ToString() 即客户端随机从多个wcf服务端的host中挑一个,生成代码类实例,WCF并发连接数的问题,在最近的开发中,总是发现人数一多就会有用户莫名其
17、妙的界面卡死,或者直接掉线的情况,不知道是什么原因,由于项目采用的是netTcp绑定,猜想可能是并发连接的问题。于是查了一下: 在windows7中,并发连接数默认是10, ,使用不同的实例模式,需要注意的有哪些?,1 对于PerCall模式,一定要记住,如果服务对象中的数据没有固化,并且不是静态变量,那它每次操作都会被重新初始化。 2 对于PerSession模式, PerSession模式并不是代表状态会自动维护,那些被设置了IsTerminating=True的操作完成的时候,也会释放资源和销毁对象。即使不是Ture,那如果客户端长时间不与服务端联系,达到服务端最大忍耐限度,服务端也会变
18、心。 3 对于Single模式,既然例外就它老哥一个,就简单得多了,它能保持服务对象中的非静态全局变量。但是特别要注意的是,如果在这种模式下的话,要特别注意线程安全的问题,让10个人同时让一个理发师傅来服务。,并发总结,A.首先当binding不支持session时候,所有设置都不会支持Session;单调和会话模式都是调用不同的实例,只有单例模式调用相同实例。 B.当我们设置SessionModel为NotAllowed(TCP绑定下,不可以设置SessionModel为NotAllowed,否则会出现这个错误“协定不允许会话,但是绑定“NetTcpBinding”不支持数据图,或者因配置不正确而无法支持数据图。”)时(其实等同于A) 如果是单调模式,不存在SessionId,每次调用不同实例 如果是会话模式,不存在SessionId,每次调用不同实例(实际就等于单调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文档管理资料归档与存储方案
- 2024-2025学年度监理工程师考前冲刺练习【研优卷】附答案详解
- 2024-2025学年度收银审核员考前冲刺练习试题(满分必刷)附答案详解
- 2024-2025学年度环卫垃圾处理工考试历年机考真题集【名师系列】附答案详解
- 2024-2025学年医疗卫生系统人员模拟题库附参考答案详解(综合题)
- 2024-2025学年度医院三基考试题库及答案详解(典优)
- 2024-2025学年度临床执业医师考试综合练习含答案详解【考试直接用】
- 2024-2025学年度华东师大版7年级下册期末测试卷含答案详解【达标题】
- 2024-2025学年度电工考前冲刺试卷及参考答案详解【综合题】
- 2024-2025学年反射疗法师大赛理论题库检测试题打印及完整答案详解【网校专用】
- 2026年湖南有色金属职业技术学院单招职业技能考试题库附答案
- 数字普惠金融对于乡村振兴影响的实证分析-以河南省为例
- 2025年《教育管理》知识考试题库及答案解析
- 建筑毕业论文2000字
- 多器官功能衰竭长期卧床患者支持方案
- 2025年江西机电职业技术学院单招职业技能测试题库附答案
- 餐饮订餐服务合同范本
- 中职班级管理课件
- 检验科临床检验标本采集技术规范
- 2026年常州工业职业技术学院单招职业技能测试必刷测试卷附答案
- 合同与协议签订标准范本
评论
0/150
提交评论