WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(CallBack).所属分类:WCF分布式开发步步为赢,SOAandEAIWCF除了支持经典的请求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什么不同以及我们如何在开发中使用这些操作调用模式。今天本节文章里会详细介绍。WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(CallBack).本文结构:【1】请求应答(Request-Reply)、【2】单向操作(One-Way)、【3】回调操作(CallBack)、【4】示例代码分析、【5】总结。最后上传本文的示例代码。WCF除了支持经典的请求/应答模式意外,还提供了对单向操作、双向回调操作模式的支持,此外还有流操作(后者与WSE3.0提供的优化传输机制类似,我曾经在这个文章里进行过讲解WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载)。今天我们会介绍几种操作调用模式的概念,区别,实现机制,以及如何在代码中实现他们,最后给出的要注意的细节问题。【1】请求应答(Request-Reply):请求应答模式是默认的操作模式。这与经典的C/S编程类似,客户端发送请求,阻塞客户端进程,服务端返回操作结果。请求应答模式与绑定对应关系:1.绑定协议名称支持可靠性默认可靠性支持有序传递请求应答模式2.BasicHttpBindingNoN/ANoYes3.NetTcpBindingYesOffYesYes4.NetPeerTcpBindingNoN/ANoNo5.NetNamedPipeBindingNoN/A(On)YesYes6.WSHttpBindingYesOffYesYes7.WSFederationHttpBindingYesOffYesYes8.WSDualHttpBindingYesOnYesYes9.NetMsmqBindingNoN/ANoNo10.MsmqIntegrationBindingNoN/ANoYes除了NetPeerTcpBinding和NetMsmqBinding绑定,所有的绑定均支持请求-应答操作。【2】单向操作(One-Way):【2.1】概念:简单来说,单向操作没有返回值,客户端只管调用,不管结果。单向操作客户端一旦发出请求,WCF会生成一个请求,不会给客户端返回任何消息。单向操作不同于异步操作,虽然单向操作只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入队列,并在某个时候执行。队列存储调用的个数是有限的,一旦发出的调用个数超出了队列存储调用的设置值,则会发生阻塞现象,因为调用无法放入队列。当队列的请求出列后,产生阻塞的调用就会放入队列,并解除对客户端的阻塞。绑定协议与单向请求模式关系:绑定协议名称支持可靠性默认可靠性支持有序传递单向模式BasicHttpBindingNoN/ANoYesNetTcpBindingYesOffYesYesNetPeerTcpBindingNoN/ANoYesNetNamedPipeBindingNoN/A(On)YesYesWSHttpBindingYesOffYesYesWSFederationHttpBindingYesOffYesYesWSDualHttpBindingYesOnYesYesNetMsmqBindingNoN/ANoYesMsmqIntegrationBindingNoN/ANoYes和请求应答模式不同。所有的WCF绑定通信协议都支持单向操作。【2.2】实现方式:配置单向操作的方式也很简单,WCF的OperationContract定义了IsOneWay属性。我们设置设置单向操作的方法是利用OperationContract特性的IsOneWay属性,例如://操作契约,单调操作,不返回应答消息,会话服务中,保证是最后一个操作[OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=true)]//voidSayHello2(stringname);单向操作配置的属性定义在操作契约级别上。而不是用在服务契约级别。【2.3】单向操作小节:(1)被设置为单向操作的方法不能包含返回值,即它的返回值只能为void,否则会抛出InvalidOperationException异常。(2)在会话契约中虽然允许定义单向操作([ServiceContract(SessionMode=SessionMode.Required,Namespace="http://www.cnblogs.com/frank_xl/")]),但由于单向操作服务端管理客户端会话状态十分困难,因而,单向操作的最佳适用场景是在单调服务或单例服务中。如果在会话契约中定义了单向操作,就必须保证单向操作是终止会话的最后一个操作,返回void类型值。这可以通过分步操作来实现。代码如下://1.单向服务契约,会话服务[ServiceContract(SessionMode=SessionMode.Required,Namespace="http://www.cnblogs.com/frank_xl/...