《WCF技术内幕》翻译25:第2部分_第5章_消息:创建一个消息(下)之MessageFault

Message和SOAP Fault老徐备注1

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 FaultMessage,并需要传递这个错误信息到别的WCF基础结构部分进行处理的时候,非常有用。
System.ServiceModel.FaultCode类型表示faultcode信息。这个类型定义了几个工厂方法作为构造函数。所有的构建方法云系使用子code。FaultCode类型上的工厂方法,会自动产生发送者和接收者的错误代码(像SOAP 1.1 和SOAP 1.2定义的一样)。
System.ServiceModel.FaultReason类型表示faultreason。最简单的情况,一个构造函数接受一个String字符串作为参数。String表示人工可读的错误信息。因为人说的语言不同(Microsoft .NET开发人员也不会说一个语言),FaultReason类型定义了构造函数和方法允许程序嵌入多种版本的String和适当的基于不同文化的描述信息。
MessageFault  创建Message   我们一旦创建了MessageFault,我们可以调用Message上定义的别的工厂方法来创建一个Message。下面的代码演示了如何使用FaultCode、FaultReason和Object去创建一个MessageFault,也包括如何从MessageFault创建一个Message。
static void Main() {
// create a Receiver Fault Code
FaultCode faultCode = FaultCode.CreateReceiverFaultCode("MyFaultCode",
                                                                                                                    "urn:MyNS");
// create a meaningful FaultReason
FaultReason faultReason = new FaultReason("The value must be > 10");
    
// create an object that represents the SOAP Fault detail
SomeFaultDetail faultDetail = new SomeFaultDetail("Contoso", "SomeApp");
    
// create a MessageFault
MessageFault messageFault = MessageFault.CreateFault(faultCode,
                                                                                                             faultReason,
                                                                                                             faultDetail);
    
// Build a Message from the MessageFault, passing the MessageVersion
CreateAndShowMessage(messageFault, MessageVersion.Soap11WSAddressing10);
CreateAndShowMessage(messageFault, MessageVersion.Soap12WSAddressing10);
}
    
private static void CreateAndShowMessage(MessageFault messageFault,
                                                                                 MessageVersion version) {
// actually create the Message object w/version info
Message message = Message.CreateMessage(version,
                                                            messageFault,
                                                                                    "urn:SomeFaultAction");
// show the contents of the Message
Console.WriteLine("{0}\n", message.ToString());
}
    
// a serializable type for storing Fault detail information
[Serializable]
sealed class SomeFaultDetail {
String companyName;
String applicationName;
DateTime? dateOccurred;
    
internal SomeFaultDetail(String companyName, String applicationName) {
        this.companyName = companyName;
        this.applicationName = applicationName;
        //this.dateOccurred = null;
        this.dateOccurred = DateTime.Now;
}
}
运行代码,产生以下结果:
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing"
        xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
        <a:Action s:mustUnderstand="1">
            urn:SomeFaultAction
        </a:Action>
</s:Header>
<s:Body>
        <s:Fault>
            <faultcode xmlns:a="urn:MyNS">a:MyFaultCode</faultcode>
            <faultstring xml:lang="en-US">The value must be > 10</faultstring>
            <detail>
                <Program.SomeFaultDetail xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.datacontract.org/2004/07/MessageFaults">
                    <applicationName>SomeApp</applicationName>
                    <companyName>Contoso</companyName>
                    <dateOccurred>2006-06-14T12:34:44.52325-04:00</dateOccurred>
                </Program.SomeFaultDetail>
            </detail>
        </s:Fault>
</s:Body>
</s:Envelope>
    
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing"
        xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
        <a:Action s:mustUnderstand="1">
            urn:SomeFaultAction
        </a:Action>
</s:Header>
<s:Body>
        <s:Fault>
            <s:Code>
                <s:Value>s:Receiver</s:Value>
                <s:Subcode>
                    <s:Value xmlns:a="urn:MyNS">a:MyFaultCode</s:Value>
                </s:Subcode>
            </s:Code>
            <s:Reason>
                <s:Text xml:lang="en-US">The value must be > 10</s:Text>
            </s:Reason>
            <s:Detail>
                <Program.SomeFaultDetail xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.datacontract.org/2004/07/MessageFaults">
                    <applicationName>SomeApp</applicationName>
                    <companyName>Contoso</companyName>
                    <dateOccurred>2006-06-14T12:34:44.52325-04:00</dateOccurred>
                </Program.SomeFaultDetail>
            </s:Detail>
        </s:Fault>
</s:Body>
</s:Envelope>
这段代码展示的最显著的特性就是MessageFault如何做到消息版本独立。第一次调用CreateAndShowMessage传递的参数是MessageFault和 MessageVersion.Soap11WSAddressing10,结果是一个SOAP 1.1 Fault。第2次调用CreateAndShowMessage传递的参数是同一个MessageFault,但是MessageVersion变为MessageVersion.Soap12WSAddressing10。结果就是一个SOAP 1.2 Fault。
前面代码展示了如何从MessageFault创建一个Message。Message定义了一个接受一个MessageFault参数工厂方法和几个接受一个FaultCode的工厂方法。Message的这些工厂方法允许程序创建一个MessageFault或FaultCode标志错误。然后传递这个对象给WCF基础结构里的其它层去产生一个Message对象。
注释:这看起来像个小功能,但是确带来了巨大好处。作用上,MessageFault 类型的MessageVersion版本兼容能力允许在WCF基础结构的另外部分来决定SOAP消息版本。换句话说,WCF基础结构里只有一层为了传输需要知道SOAP消息版本,因此创建了一个热拔插和可扩展的框架。

老徐备注

1.SOAP Fault 元素
来自 SOAP 消息的错误消息被携带于 Fault 元素内部。
如果已提供了 Fault 元素,则它必须是 Body 元素的子元素。在一条 SOAP 消息中,Fault 元素只能出现一次。
SOAP Fault 元素用于下列子元素:
子元素
描述
<faultcode>
供识别故障的代码
<faultstring>
可供人阅读的有关故障的说明
<faultactor>
有关是谁引发故障的信息
<detail>
存留涉及 Body 元素的应用程序专用错误信息
2SOAP Fault Codes
在下面定义的 faultcode 值必须用于描述故障时的 faultcode 元素中:
错误
描述
VersionMismatch
SOAP Envelope 元素的无效命名空间被发现
MustUnderstand
Header 元素的一个直接子元素(带有设置为 "1" mustUnderstand 属性)无法被理解。
Client
消息被不正确地构成,或包含了不正确的信息。
Server
服务器有问题,因此无法处理进行下去。
参考:http://www.w3school.com.cn/soap/soap_fault.asp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac解决mysql忘记密码的问题(亲测有效)

打开终端依次执行如下命令 # 第一步&#xff0c;进入mysql服务 sudo /usr/local/mysql/support-files/mysql.server stop# 第一步&#xff0c;进入mysql的bin目录 cd /usr/local/mysql/bin/# 第二步&#xff0c;使用root账户&#xff08;这一步要输入mac密码&#xff09; sudo…

UVA - 572 Oil Deposits

/*1. 图也有DFS遍历和BFS遍历&#xff0c;前者用递归实现&#xff0c;后者用队列实现。由于DFS更容易编写&#xff0c;一般用DFS求连通块。求多维数组连通块的过程也称为种子填充2. 一般要尽量避免同一个格子被访问了两次&#xff0c;但是在这道题中&#xff0c;即便访问两次&a…

程序员笑话几则

自行车一个程序员骑着一个很漂亮的自行车到了公司&#xff0c;另一个程序员看到了他&#xff0c;问到&#xff0c;“你是从哪搞到的这么漂亮的车的&#xff1f;”骑车的那个程序员说&#xff0c;“我刚从那边过来&#xff0c;有一个漂亮的姑娘骑着这个车过来&#xff0c;并停在…

ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘

错误信息&#xff1a; ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2) 出现问题原因&#xff1a; 有可能是 my.cnf 配置文件中设置了 [mysqld] 的参数 socket &#xff0c;而没有设置[client]的参数socket mysql.sock 文件有…

POJ2594 Treasure Exploration

Treasure ExplorationTime Limit: 6000MS Memory Limit: 65536KTotal Submissions: 8879 Accepted: 3635Description Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you ever explored treasure? …

samba and AD

背景:在上次的背景之下(见上一文章),管理员发现公司内现有部门不多,但员工数量非常的多.如果按照用户一个一个的去创建用户并用smbpasswd增加samba的登陆用户非常的麻烦.而且公司内已经存在一台windows 2003 server域控制器(建立方法),并且包含所有员工的帐号信息.在此管理员想…

jquery 简单分页插件jQuerypage

昨天项目手机端要用到table的分页&#xff0c;考虑到手机端界面小&#xff0c;系统数据不多&#xff0c;在没考虑大批量数据处理的前提前就下载了这个插件&#xff0c;简单。 展示数据datas为json格式。 <!DOCTYPE html> <html lang"ch"> <head>&l…

Google Closure Complier的使用

参考老赵的这篇 俺觉得GC最精华的还是它的高级压缩功能&#xff0c;只不过用起来用点麻烦: 最好的是不需要引用第三方类库, 如果需要用得加上编译参数也不需要提供给第三方不要将js写到html中html里面不要有静态函数调用, 比如οnclickXXX不使用[XXX]的形式访问属性,或者说使用…

mac下载maven详细步骤

1.进入官网 Maven – Welcome to Apache Maven 2.点击download 3.点击下方的apache-maven-3.8.6-bin.zip 4.下载到本地后&#xff0c;打开settings.xml文件 5.修改 settings.xml文件内容 加上 <localRepository>/Users/wangzeyu/.m2/repository1</localRepository&…

Quick Cocos2dx 场景转换问题

项目结构是这样子的&#xff1a; 主场景代码是这样子的&#xff1a; local MainScene class("MainScene", function()return display.newScene("MainScene") end)function MainScene:ctor()self.layer display.newLayer();self:addChild(self.layer)self…

阿里云云效Maven地址

https://developer.aliyun.com/mvn/guide

如何删除隐藏着的网卡

如果你将一个虚拟机&#xff08;机器名VM1&#xff09;的vhd文件直接新建成另一个虚拟机&#xff08;机器名VM2&#xff09;&#xff0c;此时VM1虚机已经删除。但是你还是无法将VM2虚机的IP地址设置成和VM1虚机一样的IP地址&#xff0c;原因是IP地址冲突&#xff0c;而VM2虚机中…

牛顿插值法及其C++实现

牛顿插值法 一、背景引入 相信朋友们&#xff0c;开了拉格朗日插值法后会被数学家的思维所折服&#xff0c;但是我想说有了拉格朗日插值法还不够&#xff0c;因为我们每次增加一个点都得重算所有插值基底函数&#xff0c;这样会增加计算量&#xff0c;下面我们引入牛顿插值法&a…

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on

报错如下 Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project hhh: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test failed: The forked VM terminated without sa…

【原创中】儿子,听爸爸跟你说

可爱的宝贝儿子&#xff1a;可能你现在正在家里小床上酣睡&#xff0c;可惜爸爸不能在你身边陪着你。无数个夜晚&#xff0c;你妈妈他们睡在你身边照顾你&#xff0c;你知道他们有多辛苦吗&#xff1f;等你长大了&#xff0c;我会告诉你做父母的艰辛&#xff0c;我们并不是要求…

ASP.NET Core 认证与授权[1]:初识认证

在ASP.NET 4.X 中&#xff0c;我们最常用的是Forms认证&#xff0c;它既可以用于局域网环境&#xff0c;也可用于互联网环境&#xff0c;有着非常广泛的使用。但是它很难进行扩展&#xff0c;更无法与第三方认证集成&#xff0c;因此&#xff0c;在 ASP.NET Core 中对认证与授权…

IDEA创建Maven项目报错- Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model】

1&#xff1a;报错 今天下了最新版本的maven&#xff0c;在idea中配置好maven好&#xff0c;拉取依赖报错了 2:查看报错日志 报错如下 1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator: method <…

C# 动态加载 动态卸载

代码usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Threading;usingSystem.Reflection;namespaceUnloadDll{ classProgram { staticvoidMain(string[] args) { stringcallingDomainName AppDomain.CurrentDomain.…

python进行数据分析

1. python进行数据分析----线性回归 2. python进行数据分析------相关分析 3. python进行数据分析---python3卡方 4. 多重响应分析&#xff0c;多选题二分法思路 5. 交叉表思路&#xff0c;未发布 6. 比较均值分析思路 7. 排序题如何进行数据分析 8.python 二元Logistics Regr…