.NET中Web Service的异常机制
本文节选自《.NET程序员面试指南》一书

即使拥有了本地代理类等特性,调用Web Service方法毕竟和调用本地方法有所区别,问题之一就是异常的处理。可以想象,如果希望捕获Web Service服务器端产生的异常,那这些异常信息就需要被封装在SOAP信息中发送回客户端。本节将借助回答问题,简要介绍Web Service中的异常机制。
  所涉及到的知识点
•    SOAP中对异常的规定
•    服务器端对未捕获异常的处理
•    客户端代理类对fault节点的处理
  分析问题
1.SOAP中对异常的规定
SOAP规定了异常消息的携带方式,那就是全被被放入fault节点中。fault节点必须是Body节点的子节点,同时,一个SOAP消息中只能出现一个fault节点。表11-2列出了fault节点可包含的所有子节点。
表11-2  Fault的子节点
子 节 点    描    述
<faultcode>    供识别故障的代码
<faultstring>    可供人阅读的有关故障的说明
<faultactor>    有关是谁引发故障的信息
<detail>    存留涉及 Body 元素的应用程序专用错误信息
其中faultcode是一个错误码,其取值和每个值所代表的含义都在SOAP中有所定义,表11-3列出了所有faultcode及其含义。
表11-3  faultcode节点的值
faultcode节点的值    描    述
VersionMismatch    SOAP Envelope 元素的无效命名空间被发现
MustUnderstand    Header 元素的一个直接子元素(带有设置为"1"的 mustUnderstand 属性)无法被理解。
Client    消息被不正确地构成,或包含了不正确的信息。
Server    服务器有问题,因此无法处理进行下去。
2.服务器端对未捕获异常的处理
在使用WebService类型和WebMethod特性创建Web Service的情况下,服务器端的异常都会被捕捉,并且所有异常都会被放入到SoapException类型中,并且发还给客户端。这里可能会有两种情况,一种是服务器端抛出了非SoapException的异常,这时候原始的异常会被自动放到一个SoapException异常之中,而包括异常堆栈在内的很多信息都会丢失。而另一种情况是服务器端代码直接使用了SoapException异常,这时候程序员可以使用下列属性来设置SoapException对象:
•    Message:原始异常的Message属性。
•    Code:服务器异常码。
•    Actor:Web Service方法的URL。
•    Detaul:空引用,但有一个空的详细信息元素存在于故障元素中。
服务器端会把SoapException放入Fault节点之中并且发还给客户端,以此来告知服务器端产生的异常。下面是一个返回异常的SOAP消息示例:
<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Fault>
    <faultcode>soap:Server</faultcode>
    <faultstring>
      System.Web.Services.Protocols.SoapException: Server was unable to process request. ---&gt; System.Exception: 异常内容
      at Service.HelloWorld()
      --- End of inner exception stack trace ---
    </faultstring>
    <detail />
  </soap:Fault>
</soap:Body>
3.客户端代理类对fault节点的处理
如果使用.NET自动生成的Web Service代理类,那么它将能自动地识别fault节点,并且还原SoapException异常。所以在客户端通过代理类调用Web Service方法时,将能切实地捕获到一个SoapException异常。下列代码展示了这一点。
首先在Web Service的服务器端直接抛出一个异常,如代码11-8所示。
代码11-8  自定义asmx处理程序:Service.cs
//直接抛出一个Exception异常
//该异常会被包装成一个SoapException异常
[WebMethod]
public string HelloWorld()
{
    throw new Exception("异常测试!");
}
然后根据这个Web Service,在本地生成对应的代理类型,并且捕捉从服务端发送过来的SoapException。
代码11-9  自定义asmx处理程序:ServiceClient.cs
class ServiceClient
{
    static void Main(string[] args)
    {
        Service service = new Service();
        try
        {
            //异常将从Web SErvice代理类中被抛出
            service.HelloWorld();
        }
        //捕捉SoapException异常
        catch (SoapException ex)
        {
            //打印其内容
            Console.WriteLine("Actor:{0}",ex.Actor);
            Console.WriteLine("CodeName:{0}", ex.Code.Name);
            Console.WriteLine("Detail:{0}", ex.Detail.InnerText);
            Console.WriteLine("Message:{0}", ex.Message);
        }
        Console.Read();
    }
}
下面是上述代码的执行结果:
Actor:
CodeName:Server
Detail:
Message:System.Web.Services.Protocols.SoapException: Server was unable to proces
s request. ---> System.Exception: 异常测试!
   at Service.HelloWorld()
   --- End of inner exception stack trace ---
  答案
SOAP规定,一个SOAP消息中只能存在一个Fault节点来包含错误消息。在.NET框架中,Web Service服务端抛出的异常,最后多会被捕捉并且装入一个SoapException对象中,此对象会被放入Fault节点并且传输回客户端。如果客户端使用.NET自动生成的代理类,则会解析Fault节点并且重新抛出SoapException异常。

http://www.china-pub.com/508880
}J J l/m8rsm13164110
f.M T6?+~ Q13164110【书名】.NET程序员面试指南
【作者】朱毅 等 编著
【ISBN】978-7-121-07675-6
【出版社】电子工业出版社
【出版日期】2008年12月
【宣传语】
从面试的角度来梳理.NET程序员的技术功底。
以项目开发经理的眼光来审视编程知识的掌握。
【内容简介】
本 书着重针对.NET技术职位的应聘者,在.NET框架各个技术类别中,选取最常出现在.NET面试中的问题,进行分析和解答,同时解释和剖析和该问题相关 的.NET机制原理,帮助读者达到知其然更知其所以然的程度。本书几乎包揽了所有常见的面试题,从基础知识、数据库,再到比较流行的XML、测试方法和算 法,是目前市场上唯一一本面试试题集锦。
全书配合了大量的图例及代码说明,非常适合正打算参加.NET技术职位的应聘和希望梳理.NET框架下技术点的读者阅读

.NET中Web Service的异常机制相关推荐

  1. Java中的泛型与异常机制

    Java中的泛型与异常机制 ※泛型的使用 如果在使用集合时没有限定集合所保存的数据类型,则在代码运行期间容易会出现ClassCastException类转换的异常 通过设置泛型,可以在编译期间发生问题 ...

  2. ODI中web service介绍

    ODI WS架构 ODI Web Service有几种, 第一种,可将数据(Data Store)表发布为Web Service,提供有相应的查询.删除.更新.添加数据的接口: 针对这类WS,需要在应 ...

  3. PHP笔记-PHP中Web Service.

    这几天工作需要.net站点免登陆访问PHP的Wiki站点. PHP不熟,感觉很苦逼.任务下来了,必须搞定.准备用SSO,太麻烦了,要改写别人很多代码,这个是第三方CMS,封装的很厉害,不好改.最后我的 ...

  4. java中web service的几种实现方式(自用)

    https://www.cnblogs.com/liubin1988/p/8995444.html 转载于:https://www.cnblogs.com/chyxOne/p/9673126.html

  5. WCF分布式开发必备知识(4):Web Service(转)

    今天继续我们的WCF分布式开发必备知识系列文章的第4节:Web Service.前3节我们分别介绍了MSMQ消息队列/.Net Remoting/Enterprise Services三个相关的技术. ...

  6. 构建安全的Xml Web Service系列之如何察看SoapMessage

    上一篇文章地址:构建安全的Xml Web Service系列一之初探使用Soap头 (5-22 12:53)          要分析Xml Web Service的安全性,首先要解决的问题是我们能了 ...

  7. 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(2):处理异步调用中的异常...

    本文来自<ASP.NET AJAX程序设计 第II卷:客户端Microsoft AJAX Library相关>的第三章<异步调用Web Service和页面中的类方法>,请同时 ...

  8. myeclipse中生成web service时出现异常Unable to create JAXBContext

    尝试着用myeclipse生成web service,但总是报Unable to create JAXBContext错误 错误信息如下图: 解决方法: 其实仔细阅读一下堆栈信息就会发现,说 Resu ...

  9. java中调用kettle作业以及生成web service 接口

    第一步:(前提将kett中lib下的所有jar包拷贝到java项目lib目录)创建并连接资源库,如果只用这一个工作空间,可以将此段代码放入静态代码块,代码如下: KettleEnvironment.i ...

  10. Web站点下的Web Service读取此Web站点中的Session值

    在用Ajax:AutoCompleteExtender控件时,碰到自动完成的数据没办法按当前登录用户过滤权限的问题,主要是因为AutoComplete.asmx中自动完成的Method参数是固定的,不 ...

最新文章

  1. OO-ALV标准工具栏按钮
  2. Mysql windows 安装提示MSVCR120.dll文件丢失
  3. oracle 误删表空间文件启动不了数据库的解决办法
  4. 学校计算机考察内容是什么意思,2019考研计算机复试四项考察内容分析及注意事项...
  5. 桌面云的四大协议解析
  6. java.lang.NoClassDefFoundError: org/springframework/dao/support/DaoSupport ...
  7. http协议学习系列--深入了解篇
  8. c语言中函数的知识点总结,c语言函数知识点总结
  9. HTML5 汉字上方添加拼音标注 ruby、rp、rt
  10. 如何清除Hacktool.Rootkit病毒,如何让msdirectx.sys此文件彻底删除,谢谢!
  11. C语言二叉排序树的中序遍历,C语言实现二叉树的中序线索化及遍历中序线索二叉树...
  12. 1. spark ML概述
  13. js中Array对象。concat,concat,pop,push,reserve,shift,slice,splice,toString,toLocaleString,unshift
  14. DirectX11:着色器
  15. apmserv5.2.6 mysql启动失败_win7(xp) APMServ5.2.6 Apache启动失败,MYSQL启动失败 的解决办法...
  16. JavaScript 进阶篇的学习~
  17. 上蔡一高2021高考成绩查询,上蔡一高高考录取名单1
  18. 2016年8月15日 星期一 --出埃及记 Exodus 16:16
  19. mysql数据库集群版_MySql数据库集群
  20. Concurnas语言利用JVM开发高性能应用程序

热门文章

  1. nginx服务器上 font awesome 字体不能正常显示
  2. Toad for Oracle Authorization key
  3. 经过多次试验后第一个成功地实现 HTTPService 与 MXML 之间传递数据,ArrayCollection 与DataGrid 之间成功绑定...
  4. 从 Chrome 谈到 Adobe
  5. 【LeetCode】347-前K个高频元素
  6. cocos2d-html5 碰撞检测的几种方法
  7. [SPM_hw1]记一次项目经历
  8. 中国快递包裹总量的预测-基于SARIMA模型
  9. ubuntu编译运行xv6
  10. 美国ADP就业数据是什么?与非农有何关系