.NET中Web Service的异常机制

    技术2022-05-11  22

    .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. ---> 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框架下技术点的读者阅读

    最新回复(0)