版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).所属分类: WCF分布式开发步步为赢, SOA and EAI WCF除了支持经典的请求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什么不同以及我们如何在开发中使用这些操作调用模式。今天本节文章里会详细介绍。WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).本文结构:【1】请求应答(Request-Reply)、
2、【2】单向操作(One-Way)、【3】回调操作(Call Back)、【4】示例代码分析、【5】总结。最后上传本文的示例代码。 WCF除了支持经典的请求/应答模式意外,还提供了对单向操作、双向回调操作模式的支持,此外还有流操作(后者与WSE3.0提供的优化传输机制类似,我曾经在这个文章里进行过讲解WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载 )。今天我们会介绍几种操作调用模式的概念,区别,实现机制,以及如何在代码中实现他们,最后给出的要注意的细节问题。【1】请求应答(Request-Reply):
3、60; 请求应答模式是默认的操作模式。这与经典的C/S编程类似,客户端发送请求,阻塞客户端进程,服务端返回操作结果。请求应答模式与绑定对应关系 :1. 绑定协议名称 支持可靠性 默认可靠性 支持有序传递
4、 请求应答模式 2. BasicHttpBinding No N/A
5、160; No Yes 3. NetTcpBinding Yes
6、0; Off Yes
7、60;Yes 4. NetPeerTcpBinding No N/A
8、160; No No 5. NetNamedPipeBinding No N/A (On)
9、160; Yes Yes 6. WSHttpBinding Yes
10、160; Off Yes
11、Yes 7. WSFederationHttpBinding Yes Off Yes &
12、#160; Yes 8. WSDualHttpBinding Yes On
13、60; Yes Yes 9. NetMsmqBinding No
14、160; N/A No
15、160;No 10. MsmqIntegrationBinding No N/A No &
16、#160; Yes 除了NetPeerTcpBinding和NetMsmqBinding绑定,所有的绑定均支持请求-应答操作。 【2】单向操作(One-Way):【2.1】概念: 简单来说,单向操作没有返回值,客户端只管调用,不管结果。单向操作客户端一旦发出请求,WCF会生成一个请求,不会给客户端返回任何消息。单向操作不同于异步操作,虽然单向操作只是在发出调用的瞬间阻塞客户端,但如
17、果发出多个单向调用,WCF会将请求调用放入队列,并在某个时候执行。队列存储调用的个数是有限的,一旦发出的调用个数超出了队列存储调用的设置值,则会发生阻塞现象,因为调用无法放入队列。当队列的请求出列后,产生阻塞的调用就会放入队列,并解除对客户端的阻塞。绑定协议与单向请求模式关系:· 绑定协议名称 支持可靠性 默认可靠性
18、0; 支持有序传递 单向模式 · BasicHttpBinding No N/A
19、160; No Yes · NetTcpBinding
20、0; Yes Off Yes
21、; Yes · NetPeerTcpBinding No N/A
22、 No Yes · NetNamedPipeBinding No
23、; N/A (On) Yes Yes · WSHttpBinding
24、60; Yes Off Yes
25、60; Yes · WSFederationHttpBinding Yes Off
26、60; Yes Yes · WSDualHttpBinding Yes
27、 On Yes Yes · NetMsmqBinding
28、0; No N/A No
29、0; Yes · MsmqIntegrationBinding No N/A
30、160; No Yes 和请求应答模式不同。所有的WCF绑定通信协议都支持单向操作。 【2.2】实现方式: 配置单向操作的方式也很简单,WCF的OperationContract 定义了IsOneWay属
31、性。我们设置设置单向操作的方法是利用OperationContract特性的IsOneWay属性,例如: /操作契约,单调操作,不返回应答消息,会话服务中,保证是最后一个操作 OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=true)/
32、0;void SayHello2(string name); 单向操作配置的属性定义在操作契约级别上。而不是用在服务契约级别。【2.3】单向操作小节: (1)被设置为单向操作的方法不能包含返回值,即它的返回值只能为void,否则会抛出InvalidOperationException异常。 (2)在会话契约中虽然允许定义单向操作(ServiceContract( SessionMode =SessionMode.Required, Namespace = "
33、160; /1.单向服务契约,会话服务 ServiceContract( SessionMode =SessionMode.Required, Namespace = " public interface IWCFServiceOneWay /操作契约
34、,单调操作,不返回应答消息,会话服务中,保证是最后一个操作 OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=true)/ void SayHello2(string name); /操作契约,
35、 OperationContract string SayHello1(string name); (3)如果因为通信(地址宿主)问题,调用操作失败,单向操作如果抛出异常;客户端受服务端异常影响,取决于实例模式以及使用绑定。 【3】回调操作(Call Back):【3.1】概念: 回调不是一个新的概念,早在C语言里就有过
36、,C#里更是有委托实现回调机制。软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础,因此,下面我们着重讨论
37、回调机制在WCF软件架构中的实现。回调机制如图所示: 并非所有的绑定协议都支持回调,http本质上是无连接的协议,TCP/IP协议才会在客户端和服务端维持通信信道。两者之间的对应关系如下:· 绑定协议名称 支持可靠性 默认可靠性
38、 支持有序传递 回调模式 · BasicHttpBinding No N/A
39、; No No · NetTcpBinding
40、160; Yes Off Yes
41、60; Yes · NetPeerTcpBinding No N/A
42、0; No No · NetNamedPipeBinding No
43、0; N/A (On) Yes Yes · WSHttpBinding
44、160; Yes Off Yes
45、160; No · WSFederationHttpBinding Yes Off
46、0; Yes No · WSDualHttpBinding Yes
47、60; On Yes Yes · NetMsmqBinding &
48、#160; No N/A No &
49、#160; No · MsmqIntegrationBinding No N/A
50、 No No BasicHttpBinding,WSHttpBinding绑定协议不支持回调操作。NetTcpBinding和NetNamedPipeBinding绑定支持回调操作;具有可靠消息传输的WSDualHttpBin
51、ding绑定是通过设置两个HTTP信道来支持双向通信。 · 【3.2】实现代码: 一个服务契约只能包含一个回调契约。通过ServiceContract特性,可以指定回调契约: /0.回调服务契约,由于回调方法在客户端执行,因此无须添加 ServiceContractAttribute。对于回调操作,服务器无须获取其返回信息,因此添加 IsOneWay=true 特性参数。 public interface
52、160;IWCFServiceCallBack /操作契约 OperationContract(IsOneWay=true)/ void SayHelloCalllBack();
53、; /1.服务契约,指定 SessionMode 和回调类型。 ServiceContract(SessionMode = SessionMode.Required,CallbackContract = typeof(IWCFServiceCallBack) public interface IWCFService
54、60; /操作契约, OperationContract string SayHelloToUser(string name); 回调契约无须标记ServiceContract特性,但是在回调契约中必须为服务的操作标记OperationContract特性。 在导入回调契约
55、的元数据中,回调契约以Callback结尾。服务端反序列化本地代码的时候会生成客户端回调操作契约Callback后缀。【3.3】回调小节:(1)如果使用了回调契约,回调契约不需要ServiceContract特性,设置为回调契约就默认了服务契约的特性。(2)客户端通过回调传递给服务端的消息包含了回调契约终结点的引用。在服务端,可以通过OperationContext类的泛型方法GetCallbackChannel<T>()获得。代码如下: /获取客户端通道实例
56、60; IWCFServiceCallBack callback = OperationContext.Current.GetCallbackChannel<IWCFServiceCallBack>();【4】示例代码分析: 直接看概念还不能很好的理解回调的机制,下面我们来具体看看WCF里如何实现回调。客户端调用服务操作,服务操作通过客户端上下文实例调用客户端操作,这是回调操作的基本过程。一下是具体的代码实现讲解过程。这里只介绍回调操作的具体实现
57、代码。单向操作过于简单,注释也比较详细,大家可以参考上传的代码。【4.1】服务端: 定义一个回调契约IWCFServiceCallBack,服务契约IWCFService、服务类WCFService : IWCFService继承服务契约。代码如下: /1.回调服务契约,由于回调方法在客户端执行,因此无须添加 ServiceContractAttribute。对于回调操作,服务器无须获取其返回信息,因此添加 IsOneWay=true 特性参数。 public&
58、#160;interface IWCFServiceCallBack /操作契约 OperationContract()/ void SayHelloCalllBack();
59、160; /2.服务契约,指定 CallbackContract 回调契约。 ServiceContract(CallbackContract = typeof(IWCFServiceCallBack) public interface IWCFService /操作契约,
60、; OperationContract string SayHelloToUser(string name); /3.服务类,继承接口。实现服务契约定义的操作 public class WCFService : IWCFService&
61、#160; /获取当前操作客户端对象实例 IWCFServiceCallBack callback = OperationContext.Current.GetCallbackChannel<IWCFServiceCallBack>();
62、/实现接口定义的方法 public string SayHelloToUser(string name) /Action<IWCFServiceCallBack> invoke = delegat
63、e(IWCFServiceCallBack callBack) / callBack.SayHelloCalllBack(); /callback(invoke);
64、 Console.WriteLine("Hello! 0 , ", name); callback.SayHelloCalllBack(); return "Hello! " +
65、60;name; 服务端 获取当前操作客户端对象实例 IWCFServiceCallBack callback = OperationContext.Current.GetCallbackChannel<IWCFServiceCallBack>();callback.SayHelloCalllBack();执行回调客户端当前
66、实例方法。【4.2】宿主: 宿主启动和绑定节点配置和前面几节讲解的配置过程类似。这里配置的协议是TCP。配置文件代码如下:<service behaviorConfiguration="WCFService.WCFServiceBehavior" name="WCFService.WCFService"> <endpoint
67、60; address="net.tcp:/localhost:9004/WCFService" binding="netTcpBinding" contract="WCFService.IWCFService">&
68、#160; </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> <
69、host> <baseAddresses> <add baseAddress="http:/localhost:9003/"/> <
70、add baseAddress="net.tcp:/localhost:9004/"/> </baseAddresses> </host> </service> 【4.3】客户端: 运行服务托管宿主,
71、客户端添加服务引用,反序列化服务元数据,如图: 修改客户端代码,重新实现回调契约的操作方法,如下: System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "") public class WCFServiceCallback : IWCFServiceCallback &
72、#160; public void SayHelloCalllBack() Console.WriteLine("Client method is CallBacking")
73、; 测试回调代码,我们实例化一个回调类的实例,然后作为上下文实例的参数。最后把上下文作为参数实例化一个客户端代理。具体代码如下: /CallBack 回调服务 Console
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电动自行车动力核心设计课程设计
- 初中课程设计的软件
- 电动自行车动力系统设计改进课程设计
- 药品库存管理系统维护课程设计
- 一 三星堆遗址教学设计高中历史人民版选修探索历史的奥秘-人民版2004
- 容器逃逸检测系统应用课程设计
- 2026年教师招聘考试小学语文《文言文阅读》专项训练试卷(附答案)
- 九年级化学下册 第9单元 溶液 实验活动5 一定溶质质量分数的氯化钠溶液的配制教学设计 (新版)新人教版
- 2026年医疗卫生系统《药学专业知识》考试专项训练试题(附答案)
- 高中历史 第二单元 资本主义世界市场的形成和发展 第6课 殖民扩张与世界市场的拓展新课教案3 新人教版必修2
- 2026广西-东盟食品检验检测中心招聘编制外食品安全检查员22人考试备考试题及答案详解
- 2026年江苏惠隆资产管理公司 招聘试题及答案
- 新苏教版科学六年级上册1.2《燃烧与空气》教学设计
- 2026年秋新教材人教PEP版小学英语六年级上册教学计划及进度表
- 2026年中国移动副总经理岗位考试题库(完整版含答案)
- 2026年春人教版小学六年级数学上册第2单元《分数乘法》完整教案
- 2026江苏盐城市大丰区西团镇人民政府招聘村级后备跟岗人员4人考试参考题库及答案详解
- 2026年学法考试题库(附答案)
- 烟草系统遴选常见试题及完整答案梳理
- 中远海运集团2026年第七次社招笔试真题
- 2026年秋人美版(新教材)小学美术四年级上册(全册)教学设计(附目录p153)
评论
0/150
提交评论