Welcome

首页 / 软件开发 / WCF / 《WCF技术内幕》25:第2部分_第5章_消息:创建一个消息(下)之MessageFault

《WCF技术内幕》25:第2部分_第5章_消息:创建一个消息(下)之MessageFault2011-06-20 博客园 Frank Xu Lei译Message和SOAP Fault

Message类型定义了一些用来创建表示SOAP Fault消息对象的工厂方法。SOAP Fault是SOAP消息的一种形式,它用来表示错 误信息。在SOAP规范(1.1 和1.2)对于消息体内容,并且某些时候,关于SOAP 消息头块的规定都存在差别。Message是对于SOAP消息的CLR抽象,Message可以 表示SOAP Fault,和表示一个SOAP消息一样。本节会描述一些SOAP Fault的基本 概念和创建表示SOAP Fault消息的基本类型以及如何创建一个表示SOAP Fault的 Message实例。
SOAP Fault 剖析

SOAP Fault遵守SOAP规范(1.1 和1.2)。根本上,SOAP1.1 Fault包含一个SOAP body,body里包装了一个必须 的faultcode老徐备注2、faultstring元素,还有一个可选的faultactor和 faultdetail元素。为了避免重复叙述这些规范,你可以在这里 http://www.w3.org/TR/soap11找到更多的可选择元素的消息规范。在更高层次 上,faultcode表示一个标识符,接受者和发送者可以用来辨别错误SOAP1.1 规 范,定义了一个faultcode的小集合,但是程序可以定义自己使用的唯一的 faultcode。Faultstring表示一种人工可读的 faultcode,它不是要给接收程序 (除非你想吧Faultstring显示给用户)。Faultcode是一个描述错误来源的URI 。

SOAP Fault 从SOAP 1.1到SOAP 1.2发生了很大的变化。因为SOAP 1.2 是建立在Infoset上的, SOAP 1.2 Fault本质上是由一个信息条目集合组成。除 了这些变化,SOAP Fault组成部分的名字也做了修改和扩展,以包含更多的描述 信息。SOAP 1.2规定SOAP Fault应该包含一个必须的Code和Reason(原因),一 个可选的Node、Role或Detail(详细信息)。何时增加这些信息的详细规定可以 在这里查看:http://www.w3.org/TR/soap12-part1/#soapfault。通常来说, Code是发生错误的标识符,而且也允许使用子code表示更细粒度的信息。SOAP 1.2定义了一些Code,并且允许程序定义自己的Code。Reason便是人工可读的错 误解释信息。Node表示产生错误的消息参与者。Role信息表示的是SOAP错误产生 时,消息参与者的角色。Detail是给其它消息参与者准备的错误信息。

SOAP 1.1 和1.2 Fault,抛去他们的区别,在他们描述的信息类型上还 是很相似的。两者都规定了错误代码的标签,人工可读的错误描述信息,导致 SOAP Fault的消息参与者信息和错误的其它信息。为这目的,WCF定义了一个表 示SOAP 1.1和SOAP 1.2 FaultSystem.ServiceModel.Channels.MessageFault类 型。在我们学习如何表示SOAP 1.1 和SOAP 1.2描述的SOAP Fault之前,我们先 来看看MessageFault类型如何概括归纳SOAP Fault的。
MessageFault

The MessageFault type is a way to describe error information in a SOAP-version-agnostic manner. Keeping in mind that WCF has a highly layered architecture, the MessageFault type provides tremendous flexibility when processing SOAP messages and optionally generating exceptions.

MessageFault类型可以描述各种SOAP版本的错 误信息。记住WCF拥有更高层的架构,MessageFault类型在处理SOAP消息或者产 生异常的时候提供了巨大的灵活性。

创建一个 MessageFault对象 像 许多WCF里的别的类型一样,MessageFault是个定义了几个工厂方法的抽象类型 。这些工厂方法接受表示SOAP Fault里存储信息的参数。此外MessageFault同样 定义了接受产生SOAP Fault的消息参与者的标识作为参数。值得注意的是, MessageFault定义了一个工厂方法接受一个Message作为参数。这个方法在WCF接 收一个SOAP Fault Message,并需要传递这个错误信息到别的WCF基础结构部分 进行处理的时候,非常有用。

System.ServiceModel.FaultCode类型表示 faultcode信息。这个类型定义了几个工厂方法作为构造函数。所有的构建方法 云系使用子code。FaultCode类型上的工厂方法,会自动产生发送者和接收者的 错误代码(像SOAP 1.1 和SOAP 1.2定义的一样)。

System.ServiceModel.FaultReason类型表示faultreason。最简单的情 况,一个构造函数接受一个String字符串作为参数。String表示人工可读的错误 信息。因为人说的语言不同(Microsoft .NET开发人员也不会说一个语言), FaultReason类型定义了构造函数和方法允许程序嵌入多种版本的String和适当 的基于不同文化的描述信息。

除了那一个MessageFault定义的工厂方法 ,其它的都接受一个FaultCode 和FaultReason类型作为参数。因此,这些类型 必须在MessageFault 创建之前实例化,除了从Message创建MessageFault。几个 工厂方法也接受Object作为参数,这个表示额外的错误信息。对于 Message工厂 方法里的Object参数,它们必须支持序列化(更多序列化的内容在第9章)。这 个参数的存在带来一个问题,”我该使用什么类型作为参数?”因为 System.Exception 是可序列化的,你或许会传递一个Exception参数。我强烈建 议你打消这个想法。我更愿意自定义一个传递错误信息给其它消息参与者的类型 。正如我们将会在第9章看到的一样,这给契约带来了一个变化。