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

下载本文档

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

文档简介

1、.:.; HYPERLINK cnblogs/frank_xl/archive/2021/05/05/1437494.html WCF分布式开发步步为赢(10):恳求应对Request-Reply、单向操作(One-Way)、回调操作(Call Back).所属分类: HYPERLINK cnblogs/frank_xl/category/176067.html WCF分布式开发步步为赢, HYPERLINK cnblogs/frank_xl/category/176071.html SOA and EAI WCF除了支持经典的恳求应对Request-Reply方式外,还提供了什么操作调用方式

2、,他们有什么不同以及我们如何在开发中运用这些操作调用方式。今天本节文章里会详细引见。WCF分布式开发步步为赢(10):恳求应对Request-Reply、单向操作(One-Way)、回调操作(Call Back).本文构造:【1】恳求应对Request-Reply、【2】单向操作(One-Way)、【3】回调操作(Call Back)、【4】例如代码分析、【5】总结。最后上传本文的例如代码。 WCF除了支持经典的恳求/应对方式不测,还提供了对单向操作、双向回调操作方式的支持,此外还有流操作后者与WSE3.0提供的优化传输机制类似,我曾经在这个文章里进展过讲解 HYPERLINK cnblogs

3、/frank_xl/archive/2021/03/11/1408173.html WSE3.0构建Web效力平安(4):MTOM音讯传输优化和文件上传、下载 。今天我们会引见几种操作调用方式的概念,区别,实现机制,以及如何在代码中实现他们,最后给出的要留意的细节问题。【1】恳求应对Request-Reply: 恳求应对方式是默许的操作方式。这与经典的C/S编程类似,客户端发送恳求,阻塞客户端进程,效力端前往操作结果。恳求应对方式与绑定对应关系 :绑定协议称号支持可靠性 默许可靠性 支持有序传送 恳求应对方式 BasicHttpBinding No N/A NoYes NetTcpBindin

4、g YesOff YesYes NetPeerTcpBindingNo N/A No No NetNamedPipeBinding No N/A (On) YesYes WSHttpBinding YesOff Yes Yes WSFederationHttpBinding YesOff Yes Yes WSDualHttpBinding Yes On YesYes NetMsmqBinding No N/ANoNo MsmqIntegrationBindingNoN/A No Yes 除了NetPeerTcpBinding和NetMsmqBinding绑定,一切的绑定均支持恳求-应对操作。

5、【2】单向操作(One-Way):【2.1】概念: 简单来说,单向操作没有前往值,客户端虽然调用,不论结果。单向操作客户端一旦发出恳求,WCF会生成一个恳求,不会给客户端前往任何音讯。单向操作不同于异步操作,虽然单向操作只是在发出调用的瞬间阻塞客户端,但假设发出多个单向调用,WCF会将恳求调用放入队列,并在某个时候执行。队列存储调用的个数是有限的,一旦发出的调用个数超出了队列存储调用的设置值,那么会发生阻塞景象,由于调用无法放入队列。当队列的恳求出列后,产生阻塞的调用就会放入队列,并解除对客户端的阻塞。绑定协议与单向恳求方式关系: 绑定协议称号支持可靠性 默许可靠性 支持有序传送 单向方式 B

6、asicHttpBinding No N/A NoYes NetTcpBinding YesOff YesYes NetPeerTcpBindingNo N/A NoYes NetNamedPipeBinding No N/A (On) YesYes WSHttpBinding YesOff Yes Yes WSFederationHttpBinding YesOff Yes Yes WSDualHttpBinding Yes On YesYes NetMsmqBinding No N/ANoYes MsmqIntegrationBindingNoN/A No Yes 和恳求应对方式不同。一切

7、的WCF绑定通讯协议都支持单向操作。 【2.2】实现方式: 配置单向操作的方式也很简单,WCF的OperationContract 定义了IsOneWay属性。我们设置设置单向操作的方法是利用OperationContract特性的IsOneWay属性,例如: /操作契约,单调操作,不前往应对音讯,会话效力中,保证是最后一个操作OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=true)/voidSayHello2(stringname); 单向操作配置的属性定义在操作契约级别上。而不是用在效力契约级别。【2.3】

8、单向操作小节:1被设置为单向操作的方法不能包含前往值,即它的前往值只能为void,否那么会抛出InvalidOperationException异常。2在会话契约中虽然允许定义单向操作ServiceContract( SessionMode =SessionMode.Required, Namespace = cnblogs/frank_xl/),但由于单向操作效力端管理客户端会话形状非常困难,因此,单向操作的最正确适用场景是在单调效力或单例效力中。假设在会话契约中定义了单向操作,就必需保证单向操作是终止会话的最后一个操作,前往void类型值。这可以经过分步操作来实现。代码如下:/1.单向效力

9、契约,会话效力ServiceContract(SessionMode=SessionMode.Required,Namespace=cnblogs/frank_xl/)publicinterfaceIWCFServiceOneWay/操作契约,单调操作,不前往应对音讯,会话效力中,保证是最后一个操作OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=true)/voidSayHello2(stringname);/操作契约,OperationContractstringSayHello1(stringname);3假

10、设由于通讯地址宿主问题,调用操作失败,单向操作假设抛出异常;客户端受效力端异常影响,取决于实例方式以及运用绑定。 【3】回调操作(Call Back):【3.1】概念: 回调不是一个新的概念,早在C言语里就有过,C#里更是有委托实现回调机制。软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步伐用、回调和异步伐用。同步伐用是一种阻塞式调用,调用方要等待对方执行终了才前往,它是一种单向调用;回调是一种双向调用方式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步伐用是一种类似音讯或事件的机制,不过它的调用方向刚好相反,接口的效力在收到某种讯息或发生某种事件时,会自动通

11、知客户方即调用客户方的接口。回调和异步伐用的关系非常严密,通常我们运用回调来实现异步音讯的注册,经过异步伐用来实现音讯的通知。同步伐用是三者当中最简单的,而回调又经常是异步伐用的根底,因此,下面我们着重讨论回调机制在WCF软件架构中的实现。回调机制如下图: 并非一切的绑定协议都支持回调,http本质上是无衔接的协议,TCP/IP协议才会在客户端和效力端维持通讯信道。两者之间的对应关系如下: 绑定协议称号支持可靠性 默许可靠性 支持有序传送 回调方式 BasicHttpBinding No N/A NoNo NetTcpBinding YesOff YesYes NetPeerTcpBindin

12、gNo N/A NoNo NetNamedPipeBinding No N/A (On) YesYes WSHttpBinding YesOff YesNo WSFederationHttpBinding YesOff YesNo WSDualHttpBinding Yes On YesYes NetMsmqBinding No N/ANoNo MsmqIntegrationBindingNoN/A No No BasicHttpBinding,WSHttpBinding绑定协议不支持回调操作。NetTcpBinding和NetNamedPipeBinding绑定支持回调操作;具有可靠音讯传输

13、的WSDualHttpBinding绑定是经过设置两个HTTP信道来支持双向通讯。 【3.2】实现代码: 一个效力契约只能包含一个回调契约。经过ServiceContract特性,可以指定回调契约:/0.回调效力契约,由于回调方法在客户端执行,因此无须添加ServiceContractAttribute。对于回调操作,效力器无须获取其前往信息,因此添加IsOneWay=true特性参数。publicinterfaceIWCFServiceCallBack/操作契约OperationContract(IsOneWay=true)/voidSayHelloCalllBack();/1.效力契约,指

14、定SessionMode和回调类型。ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(IWCFServiceCallBack)publicinterfaceIWCFService/操作契约,OperationContractstringSayHelloToUser(stringname); 回调契约无须标志ServiceContract特性,但是在回调契约中必需为效力的操作标志OperationContract特性。 在导入回调契约的元数据中,回调契约以Callback结尾。效力端反序列化本地代码的

15、时候会生成客户端回调操作契约Callback后缀。【3.3】回调小节:1假设运用了回调契约,回调契约不需求ServiceContract特性,设置为回调契约就默许了效力契约的特性。2客户端经过回调传送给效力端的音讯包含了回调契约终结点的援用。在效力端,可以经过OperationContext类的泛型方法GetCallbackChannel()获得。代码如下:/获取客户端通道实例IWCFServiceCallBackcallback=OperationContext.Current.GetCallbackChannel();【4】例如代码分析: 直接看概念还不能很好的了解回调的机制,下面我们来详

16、细看看WCF里如何实现回调。客户端调用效力操作,效力操作经过客户端上下文实例调用客户端操作,这是回调操作的根本过程。一下是详细的代码实现讲解过程。这里只引见回调操作的详细实现代码。单向操作过于简单,注释也比较详细,大家可以参考上传的代码。【4.1】效力端: 定义一个回调契约IWCFServiceCallBack,效力契约IWCFService、效力类WCFService : IWCFService承继效力契约。代码如下:/1.回调效力契约,由于回调方法在客户端执行,因此无须添加ServiceContractAttribute。对于回调操作,效力器无须获取其前往信息,因此添加IsOneWay=t

17、rue特性参数。publicinterfaceIWCFServiceCallBack/操作契约OperationContract()/voidSayHelloCalllBack();/2.效力契约,指定CallbackContract回调契约。ServiceContract(CallbackContract=typeof(IWCFServiceCallBack)publicinterfaceIWCFService/操作契约,OperationContractstringSayHelloToUser(stringname);/3.效力类,承继接口。实现效力契商定义的操作publicclassWC

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

19、elloCalllBack();returnHello!+name; 效力端获取当前操作客户端对象实例 IWCFServiceCallBack callback = OperationContext.Current.GetCallbackChannel();callback.SayHelloCalllBack();执行回调客户端当前实例方法。【4.2】宿主: 宿主启动和绑定节点配置和前面几节讲解的配置过程类似。这里配置的协议是TCP。配置文件代码如下:【4.3】客户端: 运转效力托管宿主,客户端添加效力援用,反序列化效力元数据,如图: 修正客户端代码,重新实现回调契约的操作方法,如下:Syst

20、em.CodeDompiler.GeneratedCodeAttribute(System.ServiceModel,)publicclassWCFServiceCallback:IWCFServiceCallbackpublicvoidSayHelloCalllBack()Console.WriteLine(ClientmethodisCallBacking); 测试回调代码,我们实例化一个回调类的实例,然后作为上下文实例的参数。最后把上下文作为参数实例化一个客户端代理。详细代码如下:/CallBack回调效力Console.WriteLine(CallBackOperationTest);

21、WCFClientCallBack.IWCFServiceCallbackcallBack=newWCFClientCallBack.WCFServiceCallback();InstanceContextcontext=newInstanceContext(callBack);WCFClientCallBack.WCFServiceClientWCFServiceCallBackClientProxy=newWCFClientCallBack.WCFServiceClient(context,NetTcpBinding_IWCFService);/经过代理调用调用SayHelloToUser

22、,传送对象Console.WriteLine(WCFServiceCallBackClientProxy.SayHelloToUser(FrankXuLeiCallBack);【4.4】运转结果: 这里的运转结果包括单向操作和回调操作结果,客户端调用一个效力操作,效力操作再经过客户端上下文实例援用调用客户端操作。胜利执行回调操作。结果如图:【5】总结:1效力对回调的调用能够会产生死锁。就是指当回调的应对音讯也需求获得与效力实例关联的一样的锁时,会导致死锁。此时效力线程曾经被阻塞,效力操作正在等待回调操作执行终了,而回调操作却又在等待效力释放锁。 处理死锁的方法:将效力配置为允许多线程访问,会添

23、加效力开发者负担。将回调设置为重入Reentrancy /3.效力类,承继接口。实现效力契商定义的操作 ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant) public class WCFService : IWCFService . 。所谓“重入,是指对同步域拥有独占访问权的线程A调用了同步域之外对象的方法,此时,另外的线程B假设要访问该同步域,那么线程A将释放对同步域的锁,允许线程B进入。直到线程B执行终了并释放对同步域的锁后,线程A将重新进入该同步域。由于效力被配置为重入,那么效力调用回调援用时会释放锁。然后将回调前往给客户端,控制权那么前往给效力,效力会重入并重新获取锁。将回调操作设置为单向操作 OperationContract(IsOneWay=true)/void SayHelloCalllBack();。此时,回调调用不会产生应对音讯,效力操作一旦执行了回调操作,就会继续执行,回调对象不会争用与效力实例关联的锁,从而处理了死锁问题。2单调效力的回调问题需求思索回调对象的援用存储问题,由于

温馨提示

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

评论

0/150

提交评论