`
cloudtech
  • 浏览: 4622508 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

.NET中Web Service的异常机制

 
阅读更多
.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
分享到:
评论

相关推荐

    asp.net知识库

    利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文...

    亮剑.NET深入体验与实战精要2

    7.10 Web Service开发中需要注意的问题 316 本章常见技术面试题 320 常见面试技巧之经典问题巧回答 320 本章小结 321 第8章 用户体验的杀手锏—— Ajax 323 8.1 Ajax概述 324 8.1.1 什么是Ajax 324 8.1.2 Ajax技术的...

    亮剑.NET深入体验与实战精要3

    7.10 Web Service开发中需要注意的问题 316 本章常见技术面试题 320 常见面试技巧之经典问题巧回答 320 本章小结 321 第8章 用户体验的杀手锏—— Ajax 323 8.1 Ajax概述 324 8.1.1 什么是Ajax 324 8.1.2 Ajax技术的...

    ASP.NET 3.5 开发大全

    第14章 ASP.NET XML和Web Service 14.1 XML简介 14.2 读写XML 14.2.1 XML与HTML 14.2.2 创建XML文档 14.2.3 XML控件 14.2.4 XML文件读取类(XmlTextReader) 14.2.5 XML文件编写类(XmlTextWriter) 14.2.6 XML文本...

    ASP.NET3.5从入门到精通

    第 14 章 ASP.NET XML 和Web Service 14.1 XML 简介 14.2 读写XML 14.2.1 XML 与HTML 14.2.2 创建XML 文档 14.2.3 XML 控件 14.2.4 XML 文件读取类(XmlTextReader) 14.2.5 XML 文件编写类(XmlTextWriter) 14.2.6...

    ASP.NET 3.5 开发大全word课件

    第14章 ASP.NET XML和Web Service 14.1 XML简介 14.2 读写XML 14.2.1 XML与HTML 14.2.2 创建XML文档 14.2.3 XML控件 14.2.4 XML文件读取类(XmlTextReader) 14.2.5 XML文件编写类(XmlTextWriter) 14.2.6 XML文本...

    ASP.NET 3.5 开发大全11-15

    第14章 ASP.NET XML和Web Service 14.1 XML简介 14.2 读写XML 14.2.1 XML与HTML 14.2.2 创建XML文档 14.2.3 XML控件 14.2.4 XML文件读取类(XmlTextReader) 14.2.5 XML文件编写类(XmlTextWriter) 14.2.6 XML文本...

    ASP.NET 3.5 开发大全1-5

    第14章 ASP.NET XML和Web Service 14.1 XML简介 14.2 读写XML 14.2.1 XML与HTML 14.2.2 创建XML文档 14.2.3 XML控件 14.2.4 XML文件读取类(XmlTextReader) 14.2.5 XML文件编写类(XmlTextWriter) 14.2.6 XML文本...

    ASPNET35开发大全第一章

    第14章 ASP.NET XML和Web Service 14.1 XML简介 14.2 读写XML 14.2.1 XML与HTML 14.2.2 创建XML文档 14.2.3 XML控件 14.2.4 XML文件读取类(XmlTextReader) 14.2.5 XML文件编写类(XmlTextWriter) 14.2.6 XML文本...

    net学习笔记及其他代码应用

    2.使用VS.NET中的Add Web Reference菜单选项 23..net Remoting 的工作原理是什么? 答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。 24.在C#中,string str = null 与 string str = ...

    CLR.via.C#.Second.Edition.Feb.2006 part2

    本书作者Jeffrey Richter针对开发各种应用程序(如Web Form、Windows Form和Web服务、Microsoft SQL Server解决方案、控制台应用程序、NT Service)的开发人员,深入揭示了公共语言运行库(CLR)和.NET Framework.,...

    CLR.via.C#.Second.Edition.Feb.2006 part1

    本书作者Jeffrey Richter针对开发各种应用程序(如Web Form、Windows Form和Web服务、Microsoft SQL Server解决方案、控制台应用程序、NT Service)的开发人员,深入揭示了公共语言运行库(CLR)和.NET Framework.,...

    框架设计(2010年第3版-英文):CLR Via C# -part1

    序、NT Service)的开发人员,深入揭示了公共语言运行库(CLR)和.NET Framework.,演示了如何将这 些知识应用到实际开发。全书分5部分,共24章。第1部分讲述CLR基础,第11部分介绍类型的使用,第III 部分说明类型...

    框架设计(2010年第3版-英文):CLR Via C# -part2

    序、NT Service)的开发人员,深入揭示了公共语言运行库(CLR)和.NET Framework.,演示了如何将这 些知识应用到实际开发。全书分5部分,共24章。第1部分讲述CLR基础,第11部分介绍类型的使用,第III 部分说明类型...

    C#微软培训资料

    C#语言在.NET 框架中的作用及其特性 1.1 Microsoft.NET 一场新的革命 1.1.1 什么是.NET 2000 年 6 月 22 日 不论对 Microsoft 还是对整个 IT 业界都将成为值得纪念的一天 这一天 微软公司正式推出...

    WCF全面解析(套装上下册) 高清pdf 带书签 part2(共4)

    如果读者具备了DCOM、Enterprise Library Service、.NET Remoting、Web Service、MSMQ及SOA相关的基础,对阅读此书尽快掌握WCF将大有裨益。 名人推荐我经历了COM时代,一直把Don Box的《COMM本质论》奉为我的指路...

    WCF全面解析(源码)

    如果读者具备了DCOM、Enterprise Library Service、.NET Remoting、Web Service、MSMQ及SOA相关的基础,对阅读此书尽快掌握WCF将大有裨益。 名人推荐我经历了COM时代,一直把Don Box的《COMM本质论》奉为我的指路...

    WCF全面解析(下册)

    如果读者具备了DCOM、Enterprise Library Service、.NET Remoting、Web Service、MSMQ及SOA相关的基础,对阅读此书尽快掌握WCF将大有裨益。 名人推荐我经历了COM时代,一直把Don Box的《COMM本质论》奉为我的指路...

    WCF全面解析(上册)

    如果读者具备了DCOM、Enterprise Library Service、.NET Remoting、Web Service、MSMQ及SOA相关的基础,对阅读此书尽快掌握WCF将大有裨益。 名人推荐我经历了COM时代,一直把Don Box的《COMM本质论》奉为我的指路...

    java 面试题 总结

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

Global site tag (gtag.js) - Google Analytics