http://www.cnblogs.com/yang_sy/archive/2011/05/18/2049391.html

 

【前言】

捕获和处理异常是任何专业的应用程序的一个重要组成部分。在一个复杂的桌面程序 上,许多场景都能产生一个异常,从程序错误、意外的事件、不完整的用户输入,到运行该程序一个或多个的硬件故障。在分布式环境中,异常的发生场景就更多 了。因为网络的状态,在某些情况下,无论应用程序开发人员、还是网络管理员都无法控制网络的发挥功效或者维持其处于正常的工作状态。如果把应用程序访问第 三方组件考虑在内,那么还应考虑你的分布式程序能否可靠地工作.

本章将介绍如何处理客户端和服务端的异常。你将学习到如何在服务端指定异常,以使 服务能引发该异常,并将该异常的信息推送至客户端。你还将了解到服务可能所处的状态,以及如何确定宿主程序是否从一个状态切换到另一个状态,以及如何使服 务从一个失败的状态中恢复。最后,你还将看到如何识别客户端发送给服务端的预料之外的消息。

【正文】

CLR异常与SOAP Faults

WCF服务是运行在.NET Framework CLR上的托管程序。CLR的重要特性是当托管程序发生错误时为其提供保护;CLR能识别许多系统级的错误,并在必要时引发异常。托管程序试图去捕获这些 异常并试图采取一些补救措施或者平稳地失败(报告异常的原因,为开发人员提供信息以帮助理解异常的根本原因,并采取行动纠正错误)。

SOAP规范有一部分内容专门讲述了在SOAP消息中如何使用SOAP Faults来格式化并发送错误。SOAP规范还包含了一个Schema将SOAP faults转换为XML文本并将其封装成一个SOAP消息。SOAP fault必须指定一个错误代码,fault的文字描述,及其他可选信息。使用WCF构建的支持互操作的服务将.NET Framework异常转换为SOAP faults,然后遵循SOAP规范向客户端报告并发送这些faults。CLR异常是.NET Framework独有的,而WCF目的在于构建能客户端和服务端与其他环境互操作。很显然,Java客户端不能直接识别或处理WCF服务触发的CLR异 常,那么该怎么办呢?在WCF服务端,通过将CLR异常转化成SOAP faults消息回传给客户端,这样Java客户端便能识别这些faults消息的内容,以捕获WCF服务的异常。更多关于SOAP fault的内容,请参考 http://www.w3.org/TR/soap12-part1/#soapfault

(1)(服务端)抛出和(客户端)捕获SOAP Fault

WCF类库在System.ServiceModel命名空间下提供了FaultException类。如果WCF服务抛出 FaultException对象,WCF运行时将生成SOAP fault消息并回传给客户端程序。下图例举了与FaultException类有关联的类。

WCF4.0进阶系列--第三章 构建健壮的程序和服务(转)

在本章的第一个练习中,你将添加代码至ProductService服务,使其在访问AdventureWorks数据库是能识别错误,并使用FaultException类报告这些问题给客户端。

修改WCF服务使其抛出SOAP Faults

1创建一个ProductsServiceFault的空白解决方案,并复制第二章ProductsServiceLibrary下的所有项目到此解决方案中,并将它们添加到ProductsServcieFault方案中,结果将如下图所示:

WCF4.0进阶系列--第三章 构建健壮的程序和服务(转)

2打开ProductsServiceLibrary项目下的ProductsService.cs文件,修改ListProducts方法:

catch (Exception ex)
{
if (ex.InnerException is System.Data.SqlClient.SqlException)
throw new FaultException(string.Format("Exception accessing database:{0}",
ex.InnerException.Message),
new FaultCode("Connect to database"));
else
throw new FaultException(string.Format("Exception reading from numbers: {0}",
ex.Message),
new FaultCode("Iterate through products"));
}

如果发生异常,上面的代码将检查异常的原因。如果Exception对象的InnerException属性为SqlException,那么异常 是由于Entity Framework访问数据库的代码引起。如果为其他原因,那么异常必定存在于迭代从数据库读取到产品列表的代码片段中。在这两种情况下,上述代码都会产 出一个新的FaultException对象,并指定该FualtException对象的详细信息,然后再抛出FaultExceptio对象。抛出异 常后,ListProducts操作停止运行,WCF运行时将生成一个SOAP fault,该fault包含了该异常的原因,编码(在本例中,我们简单地制定了一个名字用于区分不同的编码)的详细信息。最后,WCF运行时把SOAP fault回传至客户端。

3生成项目,确保没有错误和异常。

修改客户端使其能捕获SOAP Faults

1打开ProductsClient的Programm.cs文件,修改代码

try
{
...
}
catch (FaultException ex)
{
Console.WriteLine(
"{0}: {1}", ex.Code.Name, ex.Reason)
}

相关文章: