并发与实例化_第1页
并发与实例化_第2页
并发与实例化_第3页
并发与实例化_第4页
并发与实例化_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

并发与实例化jiangmy@会话实例化并发包含内容:会话是在两个终结点之间发送的所有消息的一种相互关系在服务协定上设置System.ServiceModel.ServiceContractAttribute.SessionMode的值Allowed:默认:客户端可以进行连接,并选择建立会话或不建立会话Required:所有调用都必须是同一个对话的一部分NotAllowed:禁止会话会话它们由应用程序显示启动和终止。会话期间传递的消息按照接收消息的顺序进行处理。Session的创建和结束都有来自Client端的调用来实现basicHttpBinding不支持Session会话具有以下概念性功能:服务对象是服务类的实例。WCF实例管理就是指当WCF服务请求到达WCF服务端后,WCF宿主(ServiceHost)创建服务对象的方式:(1)是新建一个服务对象还是重用一个服务对象?(2)在什么情况下销毁服务对象?WCF实例管理含义为了能同时响应多个WCF客户端的请求,WCF服务端应用程序是多线程的,因此,WCF服务对象是运行在多线程环境下。WCF并发管理就是解决WCF服务对象在多线程环境下如何高效运行并避免由于线程推进顺序不当造成“死锁”或由于共享资源而引发“数据读写错误”的问题。并发当服务接收到请求时,会创建一个ServiceDescription对象来封装服务的描述信息,然后,创建一个实现了服务契约的类的对象来响应请求。ServiceDescription对象表示一个完整的服务的内存中说明,包括服务的所有终结点及其各自地址、绑定、协定和行为的规范。ServiceDescription对象行为:影响运行时操作的WCF类,技术上是通过行为来实现实例化和并发在WCF中,行为(behavior)是一组类,可以用亍控制WCF基础架构中的各种组成要素。行为可以以代码属性的形式直接定义在代码中(编译后成为类型元数据),也可以放到系统配置文件(app.config或web.config)里。当客户端使用ChannelFactory<>创建代理,服务端ServiceHost创建服务对象时,都会从系统配置文件或程序集元数据中加载行为,并将其插入到适当的对象中。什么是行为?APP.config中的行为[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,ConcurrencyMode=ConcurrencyMode.Single)]

publicclassMyWCFService:IMyWCFService{//……}编译之后,服务行为将会保存到程序集的元数据中,并且与服务对象的类型(MyWCFService)关联起来。代码中的“服务行为”如果把服务对象看成是学生,那么,“行为”可以看成是“学生守则”,“学生守则”规定了学生该做什么和不该做什么。理解“行为”根据“管理对象”的不同,WCF中主要有四种“行为”:1.Servicebehaviors:管理服务对象2.Endpointbehaviors:管理终结点3.Operationbehaviors:定义操作的特性4.callbackbehaviors:用于实现回调确定WCF并发与实例访问特性的是一种“服务端行为(Servicebehavior)”行为的种类可以从每个服务都拥有的ServiceDescription对象的Behaviors属性中了解此服务拥有哪些行为。例题Concurrency中ServiceDescription重要属性当有多个WCF请求到达服务端时,ServiceHost对象到底应该创建多少个服务对象,这就是实例化(instancing)对象的问题。WCF中两个控制并发的行为:ServiceBehaviorAttribute.InstanceContextMode用于定义实例化模式。ServiceBehaviorAttribute.ConcurrencyMode用于控制服务实例内的线程并发。WCF实例管理行为PerCall:服务端为每一次的客户调用创建一个新的服务对象)instanceContext。(一次方法调用)PerSession:服务端为每一个客户代理创建一个服务对象)instanceContext。(如果要使用PerSession,必须在契约级别打开会话SessionMode=Requried,在服务级别设置nstanceContextMode=PerSession)Single:仅有一个对象为所有的客户调用服务)instanceContext高度注意:客户调用是指一次方法调用,而客户代理是指客户端创建的用于进程调用WCF服务的代理对象!InstanceContextMode枚举单调模式:每次都会创建一个新的对象。步骤如下:客户端创建代理对象(Proxy客户端调用代理对象的一个契约操作,代理对象将其传递给服务宿主程序。宿主应用程序创建一新的服务契约对象,并且执行请求操作在执行完请求操作后,如果要求有应答,那么服务契约会给代理对象一个应答,然后销毁自己。PerCallPerSession模式工作的流程如下:客户端创建代理对象(Proxy)客户端第一次调用代理对象的一个契约操作,代理对象将其调用请求传递给服务宿主宿主程序创建新的服务对象,并执行请求操作,如果有必要,返回客户端应答客户端再次发出调用操作的请求,宿主会先判断是否已有建立好的会话,如果存在,则不需要再创建新的服务对象,直接使用老对象即可。在时间达到指定要求或者因一些特殊原因,会话会过期,此时服务对象销毁。PerSessionSingle模式工作流程如下:服务端启动,同时创建服务对象客户端通过代理调用契约操作第一步中创建的服务对象接受请求,并执行操作,进行必要的应答第一步创建的服务对象将一直保留服务关闭,第一步创建的对象销毁Single单调模式:类似快餐式的经营方式,当一个请求操作来到的时候,再创建服务对象,申请必要资源,而当操作完毕之后,立即销毁对象并释放资源。大大提高服务端的吞吐能力。而且WCF中默认的实例创建模式就是这种。PerSession:与传统的C/S模式应用程序非常相似。能在服务端和客户端维护状态,当一个服务对象创建之后不会马上销毁,而是等待客户端再次来消费它,坏处:可能会浪费宝贵的服务资源。优点:能够保持连接和维护状态。应用场景:服务端操作不需要比较多的资源或者占用的资源也不宝贵的情况下,而却与客户端在不同的网络中。比较:当WCF服务对象创建以后,每个客户端发送过来请求如果不能实时响应,会将其放入请求队列中。WCF请求一般会在不同的线程中响应,因此,必须注意执行顺序,才不会出错。可以把WCF服务对象比作是一个火车票售票员,客户端请求则是要买票回家过节的旅客,很明显,“排在队前面的先买”就是维护正常购票秩序的一个基本原则,否则,大家一哄而上,就乱套了。“排在队前面的先买”就是一个“行为”。在实际开发中,我们使用ServiceBehaviorAttribute.ConcurrencyMode来确定这个WCF服务对象的服务规则。WCF并发管理行为Single:服务对象是单线程的,一次叧为一个“客人”服务(每个instanceContext一次只能有一个处理消息的线程)。Multiple:服务实例是多线程的,即同时为多个“客人”服务。无任何线程同步措施。Reentrant:服务对象是单线程的,一次叧为一个“客人”服务。但中途可以换“客人”,比如“前一客人”上厕所了,服务员可以接着服务下一位客人,等“前一客人”回来了,再继续为他服务。注意:Reentrant模式主要用亍服务端应用程序“回调”客户端应用程序的场景中。ConcurrencyMode枚举默认设置(即不明确指定值)下,WCF服务InstanceContextMode值为PerSession,ConcurrencyMode值为Single。WCF习题中session累加例题p144虽然两次调用Add方法进行累加,但是最终的结果依然是0。这好像和WCF默认的Session支持不相符,默认的Session支持是这样:ServiceInstance和Proxy绑定在一起,当调用Proxy的任何一个方法的时候Session开始,从此Session将会和Proxy具有一样的生命周期,一个proxy对应一个session。必须使用支持

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论