Welcome

首页 / 软件开发 / WCF / WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[上篇]

WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[上篇]2012-11-17 博客园 Artech对于上一篇文章 (WCF基本异常处理模式:[上篇]、[中篇]、[下篇]),主要是站在最终开发者的角度对WCF关于异常处理编程模式进行了介绍,接下来,我们需要将我们的目光转移到WCF框架内部,深入剖析整个WCF异常处理流程。在基于SOAP的消息交换过程中,异常最终通过Fault消息承载,所以很自然地,接下来的介绍从SOAP Fault说起。

一、 从SOAP Fault说起(基于SOAP 1.2)

服务调用的最终实现通过消息交换完成,WCF本质上可以看成是一个消息处理的框架。消息,不但承载着正常服务调用的请求和回复,在出现异常时,消息依然是错误信息的载体。今年来,尽管随着REST的迅速发展,基于POX(Plain of XML)消息交换大行其道;AJAX的持续升温,又是的基于非XML(JSON)的消息开始火热,但是不可否认,在今后不短的一段时间内SOAP依然是主流。看看现在有多少WS-*规范或者标准是建立在SOAP之上,就应该对这个论断不会有怀疑。

W3C先后出台了两个关于SOAP的规范:SOAP 1.1和SOAP 1.2。在《WCF技术剖析(卷1)》的第5章,我曾经按照SOAP 1.2规范对SOAP作了全面的介绍,这其中就包括对SOAP Fault。由于异常在消息交换中通过Fault消息承载,所以很多必要对SOAP Fault的相关规范作一下重申,至于SOAP的其他相关的内容,在这里就不再作重复的介绍了。

要了解SOAP 1.2下关于SOAP 1.2对SOAP Fault的规范,我们首先来看看一下一个具有完整结构的Fault SOAP。

 1: <s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
2: <s:Header>
3: <a:Action s:mustUnderstand="1">http://www.artech.com/ICalculator/DivideCalculationErrorFault</a:Action>
4: </s:Header>
5: <s:Body>
6: <s:Fault>
7: <s:Code>
8: <s:Value>s:Sender</s:Value>
9: <s:Subcode>
10: <s:Value xmlns:a="http://www.artech.com/">a:CalculationError</s:Value>
11: </s:Subcode>
12: </s:Code>
13: <s:Reason>
14: <s:Text xml:lang="zh-CN">被除数y不能为零!</s:Text>
15: </s:Reason>
16: <s:Node>http://http://www.artech.com/calculationcenter</s:Node>
17: <s:Role>http://http://www.artech.com/calculatorservice</s:Role>
18: <s:Detail>
19: <CalculationError xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.artech.com/">
20: <Message>被除数y不能为零!</Message>
21: <Operation>Divide</Operation>
22: </CalculationError>
23: </s:Detail>
24: </s:Fault>
25: </s:Body>
26: </s:Envelope>
上面一个SOAP是非常完整的Fault消息,它的主体(Body)部分包含了构成SOAP Fault所有类型的元素(必需的和可选的),接下来,我们就在这个Fault消息的基础上介绍SOAP 1.2规范下对SOAP Fault的相关规定。

在SOAP 1.2规范中规定,SOAP Fault作为Fault SOAP消息的主体,用于承载错误相关的信息。具体地,对于SOAP Fault元素,有作了如下几点规范:

元素名称必须为Fault;

元素命名空间必须为http://www.w3.org/2003/05/soap-envelope;

元素包含如下子元素(圆括号中的代表各子元素在上面给定的Fault SOAP中对应的值):

1、一个必须的Code元素表示错误代码;

2、一个比如的Reason元素表示出错的原因;

3、一个可选的Node元素表示导致出错的SOAP节点(SOAP Node);

4、一个可选的Role元素表示SOAP节点对应的角色;

5、一个可选的Detail表述对错误的详细描述。

接下来,我们对组成SOAP Fault的五个子元素进行简单的介绍。

1、Fault Code元素

SOAP Fault的Code元素,是一个用以表示错误类型的代码,该错误代码可以大致看作对错误的一种分类。SOAP 1.2对Code元素的格式作了如下的规范:

元素名称必须为“Code”,命名空间名称为“http://www.w3.org/2003/05/soap-envelope”;

Code元素只能先后包含如下两个类型的子元素;

1、一个必须的Value元素用以定义错误代码;

2、一个可选的SubCode元素用以定义错误子代码。

而对于Value元素的格式,又具有如下的规范:

元素名称必须为“Value”,命名空间名称为“http://www.w3.org/2003/05/soap-envelope”;

元素类型为“env:faultCodeEnum”枚举,下面的表格列出了所有的可选枚举值。

枚举值含义
VersionMismatch命名空间或者名称和规定的SOAP规范不匹配
MustUnderstand目标SOAP结点不能理解并处理mustUnderstand属性为“true”或者“1”的SOAP报头
DataEncodingUnknownSOAP报头或者主体的数据编码方式不被目标SOAP结点支持
Sender消息格式合法或者缺少必要的数据
ReceiverSOAP结点处理消息出现错误