WCF分布式开发步步为赢(10)请求应答(Request-Reply)、单向操作One_第1页
WCF分布式开发步步为赢(10)请求应答(Request-Reply)、单向操作One_第2页
WCF分布式开发步步为赢(10)请求应答(Request-Reply)、单向操作One_第3页
WCF分布式开发步步为赢(10)请求应答(Request-Reply)、单向操作One_第4页
WCF分布式开发步步为赢(10)请求应答(Request-Reply)、单向操作One_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、 HYPERLINK /frank_xl/archive/2009/05/05/1437494.html WCF分分布式开开发步步步为赢(10):请求求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).所属分类类: HYPERLINK /frank_xl/category/176067.html WCCF分布布式开发发步步为为赢, HYPERLINK /frank_xl/category/176071.html SOAA annd EEAI WCFF除了支支持经典典的请求求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什

2、么不同以及我们如何在开发中使用这些操作调用模式。今天本节文章里会详细介绍。WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).本文结构:【1】请求应答(Request-Reply)、【2】单向操作(One-Way)、【3】回调操作(Call Back)、【4】示例代码分析、【5】总结。最后上传本文的示例代码。 WCFF除了支支持经典典的请求求/应答模模式意外外,还提提供了对对单向操操作、双双向回调调操作模模式的支支持,此此外还有有流操作作(后者者与WSSE3.0提供供的优化化传输机机制类似似,我曾曾经在这这个文章

3、章里进行行过讲解解 HYPERLINK /frank_xl/archive/2009/03/11/1408173.html WSEE3.00构建Weeb服务务安全(4):MTOOM消息息传输优优化和文文件上传传、下载载)。今今天我们们会介绍绍几种操操作调用用模式的的概念,区区别,实实现机制制,以及及如何在在代码中中实现他他们,最最后给出出的要注注意的细细节问题题。【1】请请求应答答(Reequeest-Repply): 请求应应答模式式是默认认的操作作模式。这与经经典的CC/S编编程类似似,客户户端发送送请求,阻阻塞客户户端进程程,服务务端返回回操作结结果。请请求应答答模式与与绑定对对应关系系

4、:绑定协议议名称支支持可靠靠性 默认认可靠性性 支支持有序序传递 请求应应答模式式BasiicHtttpBBinddingg Noo N/AA NNoYees NetTTcpBBinddingg YeesOfff YessYess NetPPeerrTcppBinndinngNo N/AA Noo Noo NetNNameedPiipeBBinddingg Noo N/A (On) YYesYYes WSHtttpBBinddingg YessOfff YYes YYes WSFeederratiionHHttppBinndinng YeesOfff Yees Yees WSDuualHHtt

5、ppBinndinng Yees Onn YessYess NetMMsmqqBinndinng No N/AANNoNNo MsmqqInttegrratiionBBinddinggNooN/AA NNo YYes 除了NeetPeeerTTcpBBinddingg和NettMsmmqBiindiing绑绑定,所所有的绑绑定均支支持请求求-应答操操作。【2】单单向操作作(Onne-WWay):【2.11】概念念: 简单来来说,单单向操作作没有返返回值,客客户端只只管调用用,不管管结果。单向操操作客户户端一旦旦发出请请求,WWCF会会生成一一个请求求,不会会给客户户端返回回任何消消息。单单向操

6、作作不同于于异步操操作,虽虽然单向向操作只只是在发发出调用用的瞬间间阻塞客客户端,但但如果发发出多个个单向调调用,WWCF会会将请求求调用放放入队列列,并在在某个时时候执行行。队列列存储调调用的个个数是有有限的,一一旦发出出的调用用个数超超出了队队列存储储调用的的设置值值,则会会发生阻阻塞现象象,因为为调用无无法放入入队列。当队列列的请求求出列后后,产生生阻塞的的调用就就会放入入队列,并并解除对对客户端端的阻塞塞。绑定定协议与与单向请请求模式式关系:绑定协协议名称称支持可可靠性 默默认可靠靠性 支持有有序传递递 单向向模式BassicHHttppBinndinng NNo N/A NoYYes

7、 NettTcppBinndinng YYesOOff YeesYees NettPeeerTccpBiindiingNoo N/A NNoYYes NettNammedPPipeeBinndinng NNo NN/A (Onn) YessYess WSHHttppBinndinng YeesOfff Yess Yess WSFFedeerattionnHtttpBiindiing YYesOOff YYes YYes WSDDuallHtttpBiindiing YYes OOn YeesYees NettMsmmqBiindiing Noo N/ANoYess MMsmqqInttegrr

8、atiionBBinddinggNooN/AA NNo YYes 和请求应应答模式式不同。所有的的WCFF绑定通通信协议议都支持持单向操操作。【2.22】实现现方式: 配置置单向操操作的方方式也很很简单,WCF的OperationContract定义了IsOneWay属性。我们设置设置单向操作的方法是利用OperationContract特性的IsOneWay属性,例如:/操作契契约,单调操操作,不不返回应应答消息息,会话服服务中,保保证是最最后一个个操作OOperratiionCConttracct(IIsOnneWaay=ttruee,IssIniitiaatinng=ffalsse,II

9、sTeermiinattingg=trrue)/vvoiddSaayHeelloo2(sstriingnamme); 单向操操作配置置的属性性定义在在操作契契约级别别上。而而不是用用在服务务契约级级别。【2.33】单向向操作小小节:(1)被被设置为为单向操操作的方方法不能能包含返返回值,即即它的返返回值只只能为vvoidd,否则则会抛出出InvvaliidOpperaatioonExxcepptioon异常常。(2)在会会话契约约中虽然然允许定定义单向向操作(ServiceContract( SessionMode =SessionMode.Required, Namespace = /fra

10、nk_xl/)),但由于单向操作服务端管理客户端会话状态十分困难,因而,单向操作的最佳适用场景是在单调服务或单例服务中。如果在会话契约中定义了单向操作,就必须保证单向操作是终止会话的最后一个操作,返回void类型值。这可以通过分步操作来实现。代码如下:/11.单向向服务契契约,会话服服务SerrvicceCoontrractt(SSesssionnModde=SesssioonMoode.Reqquirred,Naamesspacce=hhttpp:/m/frrankk_xll/)ppubllicintterffaceeIWCCFSeerviiceOOneWWay/操作作契约,单调操操作,不不

11、返回应应答消息息,会话服服务中,保保证是最最后一个个操作OOperratiionCConttracct(IIsOnneWaay=ttruee,IssIniitiaatinng=ffalsse,IIsTeermiinattingg=trrue)/vvoiddSaayHeelloo2(sstriingnamme);/操作作契约,OperationContractstringSayHello1(stringname);(3)如如果因为为通信(地地址宿主主)问题题,调用用操作失失败,单单向操作作如果抛抛出异常常;客户户端受服服务端异异常影响响,取决决于实例例模式以以及使用用绑定。【3】回回调操作作(C

12、aall Bacck):【3.11】概念念: 回调不不是一个个新的概概念,早早在C语言里里就有过过,C#里更是是有委托托实现回回调机制制。软件件模块之之间总是是存在着着一定的的接口,从从调用方方式上,可可以把他他们分为为三类:同步调调用、回回调和异异步调用用。同步步调用是是一种阻阻塞式调调用,调调用方要要等待对对方执行行完毕才才返回,它它是一种种单向调调用;回回调是一一种双向向调用模模式,也也就是说说,被调调用方在在接口被被调用时时也会调调用对方方的接口口;异步步调用是是一种类类似消息息或事件件的机制制,不过过它的调调用方向向刚好相相反,接接口的服服务在收收到某种种讯息或发发生某种种事件时时,

13、会主主动通知知客户方方(即调调用客户户方的接接口)。回调和和异步调调用的关关系非常常紧密,通通常我们们使用回回调来实实现异步步消息的的注册,通通过异步步调用来来实现消消息的通通知。同同步调用用是三者者当中最最简单的的,而回回调又常常常是异异步调用用的基础础,因此此,下面面我们着着重讨论论回调机机制在WWCF软软件架构构中的实实现。回回调机制制如图所所示:并非所所有的绑绑定协议议都支持持回调,http本质上是无连接的协议,TCP/IP协议才会在客户端和服务端维持通信信道。两者之间的对应关系如下:绑定协协议名称称支持可可靠性 默默认可靠靠性 支持有有序传递递 回调调模式BassicHHttppBi

14、nndinng NNo N/A NoNNo NettTcppBinndinng YYesOOff YeesYees NettPeeerTccpBiindiingNoo N/A NNoNNo NettNammedPPipeeBinndinng NNo NN/A (Onn) YessYess WSHHttppBinndinng YeesOfff YessNo WSFFedeerattionnHtttpBiindiing YYesOOff YYesNNo WSDDuallHtttpBiindiing YYes OOn YeesYees NettMsmmqBiindiing Noo N/ANoNo M

15、MsmqqInttegrratiionBBinddinggNooN/AA NNo NNo BassicHHttppBinndinng,WSHHttppBinndinng绑定定协议不不支持回回调操作作。NeetTccpBiindiing和和NettNammedPPipeeBinndinng绑定定支持回回调操作作;具有有可靠消消息传输输的WSSDuaalHtttpBBinddingg绑定是是通过设设置两个个HTTTP信道道来支持持双向通通信。【3.2】实实现代码码: 一个个服务契契约只能能包含一一个回调调契约。通过SServviceeConntraact特特性,可可以指定定回调契契约:/00.回调

16、调服务契契约,由由于回调调方法在在客户端端执行,因因此无须须添加SerrvicceCoontrracttAtttribbutee。对于于回调操操作,服服务器无无须获取取其返回回信息,因因此添加加IsOOneWWay=truue特特性参数数。ppubllicintterffaceeIWCCFSeerviiceCCalllBacck/操作作契约OOperratiionCConttracct(IsOOneWWay=truue)/voiidSayyHellloCCallllBaack();/1.服务契契约,指定SesssioonMoode和回调调类型。SServviceeConntraact(Sess

17、sioonMoode=SSesssionnModde.RRequuireed,CCalllbacckCoontrractt=typpeoff(IWWCFSServviceeCalllBaack)pubbliccintterffaceeIWCCFSeerviice/操作作契约,OperationContractstringSayHelloToUser(stringname); 回调契契约无须须标记SServviceeConntraact特特性,但但是在回回调契约约中必须须为服务务的操作作标记OOperratiionCConttracct特性性。在导导入回调调契约的的元数据据中,回回调契约约以Ca

18、allbbackk结尾。服务端端反序列列化本地地代码的的时候会会生成客客户端回回调操作作契约CCalllbacck后缀缀。【3.33】回调调小节:(1)如果果使用了了回调契契约,回回调契约约不需要要SerrvicceCoontrractt特性,设设置为回回调契约约就默认认了服务务契约的的特性。(2)客户户端通过过回调传传递给服服务端的的消息包包含了回回调契约约终结点点的引用用。在服服务端,可可以通过过OpeerattionnConntexxt类的的泛型方方法GeetCaallbbackkChaanneel()获得。代码如如下:/获取客客户端通通道实例例IIWCFFSerrvicceCaallB

19、Backkcaallbbackk=OpeerattionnConntexxt.CCurrrentt.GeetCaallbbackkChaanneel();【4】示示例代码码分析: 直接看概概念还不不能很好好的理解解回调的的机制,下下面我们们来具体体看看WWCF里里如何实实现回调调。客户户端调用用服务操操作,服服务操作作通过客客户端上上下文实实例调用用客户端端操作,这这是回调调操作的的基本过过程。一一下是具具体的代代码实现现讲解过过程。这这里只介介绍回调调操作的的具体实实现代码码。单向向操作过过于简单单,注释释也比较较详细,大大家可以以参考上上传的代代码。【4.11】服务务端: 定义义一个回回调

20、契约约IWCCFSeerviiceCCalllBacck,服服务契约约IWCCFSeerviice、服务类类WCFFSerrvicce : IWWCFSServvicee继承服服务契约约。代码码如下:/11.回调调服务契契约,由由于回调调方法在在客户端端执行,因因此无须须添加SerrvicceCoontrracttAtttribbutee。对于于回调操操作,服服务器无无须获取取其返回回信息,因因此添加加IsOOneWWay=truue特特性参数数。ppubllicintterffaceeIWCCFSeerviiceCCalllBacck/操作作契约OOperratiionCConttracct

21、()/vvoiddSayyHellloCCallllBaack();/2.服务契契约,指定CalllbaackCConttracct回调契契约。SeerviiceCConttracct(CCalllbacckCoontrractt=typpeoff(IWWCFSServviceeCalllBaack)pubbliccintterffaceeIWCCFSeerviice/操作作契约,OperationContractstringSayHelloToUser(stringname);/3.服务类,继承接口。实现服务契约定义的操作publicclassWCFService:IWCFService/获

22、取当前操作客户端对象实例IWCFServiceCallBackcallback=OperationContext.Current.GetCallbackChannel();/实现接口定义的方法publicstringSayHelloToUser(stringname)/Actioninvoke=delegate(IWCFServiceCallBackcallBack)/callBack.SayHelloCalllBack();/callback(invoke);Console.WriteLine(Hello!0,name);callback.SayHelloCalllBack();return

23、Hello!+name; 服服务端获取当当前操作作客户端端对象实实例 IWCCFSeerviiceCCalllBacck ccalllbacck = OpperaatioonCoonteext.Currrennt.GGetCCalllbacckChhannnel();ccalllbacck.SSayHHellloCaallllBacck();执行行回调客客户端当当前实例例方法。【4.22】宿主主: 宿主主启动和和绑定节节点配置置和前面面几节讲讲解的配配置过程程类似。这里配配置的协协议是TTCP。配置文文件代码码如下:【4.33】客户户端: 运行服服务托管管宿主,客客户端添添加服务务引用,反反序

24、列化化服务元元数据,如如图: 修改客客户端代代码,重重新实现现回调契契约的操操作方法法,如下下:Syysteem.CCodeeDomm.Coompiilerr.GeenerrateedCoodeAAttrribuute(Syysteem.SServviceeModdel,0)puubliicclaassWCFFSerrvicceCaallbbackk:IWCCFSeerviiceCCalllbacckppubllicvoiidSayyHellloCCallllBaack()Coonsoole.WriiteLLinee(CllienntmmethhodisCalllBaackii

25、ng); 测试试回调代代码,我我们实例例化一个个回调类类的实例例,然后后作为上上下文实实例的参参数。最最后把上上下文作作为参数数实例化化一个客客户端代代理。具具体代码码如下:/CaallBBackk回调服服务Coonsoole.WriiteLLinee(CaallBacckOOperratiionTesst);WCCFCllienntCaallBBackk.IWWCFSServviceeCalllbaackcalllBaack=nnewWCFFCliienttCalllBaack.WCFFSerrvicceCaallbbackk();InsstannceCConttexttcoonteext=

26、nnewInsstannceCConttextt(caallBBackk);WWCFCClieentCCalllBacck.WWCFSServviceeCliienttWCCFSeerviiceCCalllBacckCllienntPrroxyy=newwWCCFCllienntCaallBBackk.WCCFSeerviiceCClieent(conntexxt,NeetTccpBiindiing_IWCCFSeerviice);/通过代代理调用用调用SSayHHellloTooUseer,传递对对象Coonsoole.WriiteLLinee(WCCFSeerviiceCCalllBacc

27、kCllienntPrroxyy.SaayHeellooToUUserr(FFrannkXXuLLeiCalllBBackk);【4.44】运行行结果: 这里的的运行结结果包括括单向操操作和回回调操作作结果,客客户端调调用一个个服务操操作,服服务操作作再通过过客户端端上下文文实例引引用调用用客户端端操作。成功执执行回调调操作。结果如如图:【5】总总结:(1)服务对对回调的的调用可可能会产产生死锁锁。就是是指当回回调的应应答消息息也需要要获得与与服务实实例关联联的相同同的锁时时,会导导致死锁锁。此时时服务线线程已经经被阻塞塞,服务务操作正正在等待待回调操操作执行行完毕,而而回调操操作却又又在等待

28、待服务释释放锁。解决死死锁的办办法:将将服务配配置为允允许多线线程访问问,会增增加服务务开发者者负担。将将回调设设置为重重入(RReenntraancyy) /3.服服务类,继继承接口口。实现现服务契契约定义义的操作作 SServviceeBehhaviior(ConncurrrenncyMModee=ConncurrrenncyMModee.Reeenttrannt) puubliic cclasss WWCFSServvicee : IWCCFSeerviice . 。所所谓“重入”,是指指对同步步域拥有有独占访访问权的的线程AA调用了了同步域域之外对对象的方方法,此此时,另另外的线线程B若要访访问该同同步域,则则线程AA将释放放对同步步域的锁锁,允许许线程BB进入。直到线线程B执行完完毕并释释放对同同步域的的锁后,线线程A将重新新进入该该同步域域。由于于服务被被配置为为重入,则服务调用回调引用时会释放锁。然后将回调返回给客户端,控制权则返回给服务,服务会重入并重新获取锁。将回调操作设置为单向操作( OperationContract(IsOneWay=true)/void SayHelloCalllBack();)。此时,回调调用不会产生应答消息,服务操作一旦执行了回调操作,就会继续执行,回调对象不会争用与服务实例关联的锁,从而解决了死锁问题

温馨提示

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

评论

0/150

提交评论