WCF响应服务基本应用技巧分享

开发 开发工具
WCF响应服务可以被看做是系统中的另一个排队服务,我们在这篇文章中将会对这一服务做一个详细的定义,以方便大家理解。

WCF中有很多比较有用的应用技巧,需要我们在不断的学习和实践中去积累经验,来达到一个熟练操作的程度。在这里我们就先为大家详细介绍一下有关WCF响应服务的一些基本应用技术,希望能给大家带来一些帮助。#t#

到目前为止,我们所介绍的排队调用的编程模型是单侧的:客户端向队列发布单向消息,再由服务处理该消息。如果排队的操作真的就是单向调用,那么这种模型足以满足要求。然而,排队服务有时候需要反过来向其客户端报告调用的结果、返回的结果,甚至是错误。但在默认情况下,这是无法实现的。Windows Communication Foundation 将排队调用与单向调用等同起来,而单向调用在本质上是禁止任何此类响应的。此外,排队服务(及其客户端)可能未处于连接状态。如果客户端发布对未连接服务的排队调用,则当服务最终获得并处理这些消息时,可能不会有客户端来接收值,因为客户端可能早已离线了。这一问题的解决方案是让服务将报告返回给客户端所提供的排队服务。我将此类服务称作WCF响应服务。

响应服务就是系统中的另一个排队服务。它同样可能与客户端断开连接并由单独的进程或单独的计算机进行托管,或者它也可能共享客户端的进程。如果响应服务共享客户端的进程,则当客户端启动时,响应服务即开始处理排队的响应。将响应服务由独立于客户端的进程(甚至是计算机)托管有助于进一步将响应服务的生存期与使用该响应服务的客户端相分离。

 

设计WCF响应服务合约

就如使用任何 Windows Communication Foundation 服务一样,客户端和服务需要预先商定响应合约及其适用对象(例如返回的值和错误信息,或仅仅是返回的值)。请注意,您也可将响应服务拆分为两个服务,一个用于响应结果,另一个用于响应错误。例如,假定有如下由排队 MyCalculator 服务所实现的 ICalculator 合约:

 

  1. [ServiceContract]  
  2. interface ICalculator  
  3. {  
  4. [OperationContract(IsOneWay = true)]  
  5. void Add(int number1,int number2);  
  6. ... //更多操作  
  7. }  
  8. [ServiceBehavior(InstanceContextModeInstanceContextMode =  
  9. InstanceContextMode.PerCall)]  
  10. class MyCalculator : ICalculator {...} 

要求 MyCalculator 服务以计算结果来响应客户端并报告所有错误。计算结果为整数形式,错误以 Windows Communication Foundation ExceptionDetail 数据合约形式表示。对于响应服务,可按下列方式定义 ICalculatorResponse 合约:

 

  1. [ServiceContract]  
  2. interface ICalculatorResponse  
  3. {  
  4. [OperationContract(IsOneWay = true)]  
  5. void OnAddCompleted(int result,ExceptionDetail error);  

支持 ICalculatorResponse 的WCF响应服务需要检查返回的错误信息,在方法结束时通知客户端应用程序、用户或应用程序管理员,并将结果提供给相关方。下面是一个支持 IcalculatorResponse 的简单响应服务:

 

  1. [ServiceBehavior(InstanceContextModeInstanceContextMode = 
    InstanceContextMode.PerCall)]  
  2. class MyCalculatorResponse : ICalculatorResponse  
  3. {  
  4. [OperationBehavior(TransactionScopeRequired = true)]  
  5. public void OnAddCompleted(int result,ExceptionDetail error)  
  6. {  
  7. MessageBox.Show("结果 = " + result,"MyCalculatorResponse");  
  8. if(error != null)  
  9. {  
  10. //处理错误  
  11. }  
  12. }  

实现 MyCalculator 和 MyCalculatorResponse 会直接引出两个问题。***个问题是同一响应服务可能会被用于处理多个排队服务上多个调用的响应(或完成),而 MyCalculatorResponse(更重要的是其所服务的客户端)无法区分这些响应。这一问题的解决方案是让发出原始排队调用的客户端向该调用分配某个***的 ID 作为标记。排队服务 MyCalculator 需要将该 ID 传递给 MyCalculatorResponse,使其能够应用与该 ID 相关的某种自定义逻辑。

第二个问题是排队服务如何发现WCF响应服务的地址。与双向回调不同的是,Windows Communication Foundation 内部并不支持将响应服务引用传递给服务。而将该地址放入服务主机配置文件中(客户端一节中)并不是明智之举,因为同一排队服务可能会被多个客户端调用,而每个客户端都有其自身专用的响应服务和地址。

一种可能的解决方案是将客户端所管理的 ID 和所需的响应服务地址作为参数基于排队服务合约明确传递给每个操作:

 

  1. [ServiceContract]  
  2. interface ICalculator  
  3. {  
  4. [OperationContract(IsOneWay = true)]  
  5. void Add(int number1,int number2,  
  6. string responseAddress,string methodID);  

同样,排队服务也可以将WCF响应服务的方法 ID 作为参数基于排队响应合约明确传递给每个操作:

 

  1. [ServiceContract]  
  2. interface ICalculatorResponse  
  3. {  
  4. [OperationContract(IsOneWay = true)]  
  5. void OnAddCompleted(int result,ExceptionDetail error,  
  6. string methodID);  

 

责任编辑:曹凯 来源: 博客园
相关推荐

2010-03-01 09:48:23

WCF会话服务

2010-03-01 15:40:04

WCF实例停用

2010-02-25 18:04:02

WCF IIS宿主

2010-03-01 16:04:31

WCF服务契约

2010-02-26 13:40:28

WCF消息头

2010-03-01 18:11:40

WCF数据契约变更

2010-03-01 11:24:31

WCF面向服务

2010-02-06 16:16:01

C++冒泡排序

2010-02-23 15:58:57

WCF Session

2010-01-21 18:26:16

VB.NET拆分合并语

2010-03-01 13:06:49

WCF继承

2010-02-25 15:25:19

WCF通道

2010-02-22 15:20:54

WCF WS-Disc

2010-02-22 17:21:02

WCF消息交换

2013-12-12 16:10:21

Lua脚本语言

2010-02-26 10:46:12

WCF行为扩展

2010-02-23 13:03:34

WCF序列化

2010-03-02 10:50:57

WCF元数据交换

2010-02-25 16:45:13

WCF应用技巧

2010-03-01 17:52:03

WCF选择绑定
点赞
收藏

51CTO技术栈公众号