WF4.0:工作流服务异常处理

简介:

使用ReceiveAndSendReply活动模板和WorkflowServiceHost可以很容易地创建一个工作流服务。它可以像一个普通WCF服务一样与其他应用程序进行通信。大部分的配置也相当简单。选择Receive活动并加以配置,和SendReply活动类似。大部分的工作用在设置OperationContract或者ServiceContract上面。

    出现了错误该怎么办

    事实上是没有任何属性可以用来指定返回的错误。

    抛出FaultException

    当Workflow服务抛出一个FaultException的时候,非常期待它被及时处理。异常能被当作SOAP错误被发送到客户端,假设客户端也是.NET,可以将它作为一个FaultException进行捕获。

    抛出FaultException<T>

    通常,当您想给异常添加一些额外的信息,您就需要创建一个额外的类,并用FaultContract属性声明服务契约,来指定返回的错误。在客户端需要添加服务元数据,做一个添加服务引用来创建所需的类型。但是,对于工作流服务,没有用于添加属性的服务契约类 。就没有属性给我们使用来实现这些目的。那么,我们如何指定与工作流服务交互的异常契约呢?

    解决方案

    窍门是给工作流上相关的Receive活动添加第二个SendReply。第二个SendReply活动返回错误契约。添加第二个SendReply活动很简单,只需右键单击Receive活动,并选择创建SendReply活动就行了。下一步创建一个变量来保存的错误信息。

我使用的FaultDetail很简单,它将所有收到的数据发送回客户端。

复制代码
 1    using  System.Runtime.Serialization; 
 2    namespace  ServicesAndFaults{    
 3   [DataContract]    
 4    public   class  FaultDetail    
 5   {        
 6   [DataMember]        
 7    public   int  Data {  get set ; }    
 8   }
 9   }
10 
复制代码

对于第二个SendReply活动,创建和抛出一个FaultException。工作流流程图如下所示:

下面的表达式用来初始化错误异常

下面的SendReply活动是返回错误,配置如下的:

有了这个设置,可以在客户端添加Service Reference和使用下面的代码得到预期的结果

复制代码
 1  static   void  Main( string [] args)
 2  {    
 3  var proxy  =   new  ServiceClient();     
 4  try     
 5  {        
 6  Console.WriteLine(proxy.GetData( 42 ));    
 7  }    
 8  catch  (FaultException < FaultDetail >  ex)    
 9  {        
10  Console.WriteLine( " FaultException<FaultDetail> with {0} " , ex.Detail.Data);    
11  }    
12  catch  (FaultException ex)    
13  {        
14  Console.WriteLine(ex);    
15  }     
16  Console.ReadLine();
17  }
复制代码

 

服务控制台应用程序中工作流输出如下。请注意,最后一条消息,“the workflow finishing”没有出现。不要奇怪,我们抛出一个异常其实没有被捕获,它终止了工作流。

但想让工作流继续跑下去!

    有时上面的处理方式很好,但有时候并不是。例如你在一个订单上工作了1个月了,你会仅仅因为一个异常而终止所有的工作吗?当然不会。

    第二种方法返回给调用客户端的个错误,只不过是SendReply活动中自定义的FaultException或FaultException <T>。客户端不会知道其中的差别,但工作流程还会继续运行。因此,我需要做的是移出Throw 活动,让第二个SendReply活动实现它的工作。

    这一次,服务控制台应用程序输出如下:





本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/03/28/workflow-4-and-soap-faults.html,如需转载请自行联系原作者

相关文章
|
算法 安全 机器人
Python语言如何使用MindOpt建模并求解二次规划问题
MindOpt是一款高效的优化算法软件包,求解算法实现了线性规划(LP)、混合整数线性规划(MILP)、二次规划(QP),可以支持命令行、c、c++、java和python调用。接下来我们将发布一系列文章,讲述各个语言如何使用 MindOpt 来求解数学规划问题。
Python语言如何使用MindOpt建模并求解二次规划问题
|
存储 NoSQL 算法
Redis6.2发布 地理位置功能增强了什么?
Redis社区最近刚刚发布Redis6.2 RC1版本,在本次发布中,阿里云Tair团队(阿里云云内存数据库产研团队,负责云上Redis社区版和Redis企业版Tair)为社区贡献了大量高质量代码与功能,其中关于地理位置查询能力的提升上,阿里云贡献了GEOSEARCH和GEOSEARCHSTORE两个重要而强大的API。本文通过分析这两个全新的API,对Redis在地理位置型应用进行深入剖析,并延伸介绍了阿里云Tair在地理位置上的更多强大功能与应用场景。
1732 0
Redis6.2发布 地理位置功能增强了什么?
|
编解码 人工智能 物联网
如何快速搭建一个像“天猫精灵”的智能语音助手?
天猫精灵相信大家都不陌生了,它是阿里巴巴于2017年7月5日发布的AI智能终端品牌。让用户以自然语言对话的交互方式,实现影音娱乐、购物、信息查询、生活服务等功能操作,成为消费者的家庭助手。本文将介绍如何快速搭建一个像“天猫精灵”一样聪明的智能语音助手。
如何快速搭建一个像“天猫精灵”的智能语音助手?
|
Java Maven
IDEA打包maven项目同时带上依赖
IDEA打包maven项目同时带上依赖
1265 0
IDEA打包maven项目同时带上依赖
|
10月前
|
新零售 供应链 数据可视化
从销售到售后:汽车经销商如何用数据工具驱动门店管理?
随着汽车市场竞争加剧,新能源车崛起和新零售模式普及,传统汽车经销商门店运营面临盈利能力下降、售后客户流失及业务管理复杂等挑战。信息化工具如项目管理软件、DMS系统、CRM系统、数据分析工具和自动化营销工具,能通过数据整合、流程优化和智能化管理,帮助经销商实现精益运营,提升竞争力。
307 2
从销售到售后:汽车经销商如何用数据工具驱动门店管理?
|
开发框架 开发者
harmoneyOs 开发框架ArkTS工程目录结构简介
【7月更文挑战第11天】harmoneyOs 开发框架ArkTS工程目录结构简介
223 2
|
NoSQL Shell Linux
|
Java
小程序中base64解码/编码
很多人都在为小程序如何实现base64编码/解码困扰,于是我参考前端大佬们对JavaScript中实现base64的文章进行了改写。简单实现了一个。。希望能帮助到小程序开发一线的大家吧、 不多说直接上代码: /** * UTF16和UTF8转换对照表 * U+00000000 – U+000000...
5162 13
|
关系型数据库 MySQL
【MySQL】max_allowed_packet=16M,是干什么的?底层原理是什么?
【MySQL】max_allowed_packet=16M,是干什么的?底层原理是什么?
687 0
灭霸打个响指的功夫,看懂Verilog多维数组【Verilog高级教程】
灭霸打个响指的功夫,看懂Verilog多维数组【Verilog高级教程】
灭霸打个响指的功夫,看懂Verilog多维数组【Verilog高级教程】