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 { getset; }    
 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活动实现它的工作。

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

    原文:Workflow 4 and soap faults

    代码:/Files/zhuqil/8424.ServicesAndFaults_05F3442D.zip

    ps: 欢迎加入WF4.0技术讨论群51262864

 



(全文完)


以下为广告部分

您部署的HTTPS网站安全吗?

如果您想看下您的网站HTTPS部署的是否安全,花1分钟时间来 myssl.com 检测以下吧。让您的HTTPS网站变得更安全!

SSL检测评估

快速了解HTTPS网站安全情况。

安全评级(A+、A、A-...)、行业合规检测、证书信息查看、证书链信息以及补完、服务器套件信息、证书兼容性检测等。

SSL证书工具

安装部署SSL证书变得更方便。

SSL证书内容查看、SSL证书格式转换、CSR在线生成、SSL私钥加解密、CAA检测等。

SSL漏洞检测

让服务器远离SSL证书漏洞侵扰

TLS ROBOT漏洞检测、心血漏洞检测、FREAK Attack漏洞检测、SSL Poodle漏洞检测、CCS注入漏洞检测。

posted @   麒麟  阅读(1753)  评论(7编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示