`
caozuiba
  • 浏览: 902897 次
文章分类
社区版块
存档分类
最新评论

Web Service异常处理

 
阅读更多
在.Net中实现Web服务时,在Web服务接口中产生的任何用户异常(非SoapException之外的异常)都被包装为SoapException传递给客户端,这使得难以采用通常的方式处理Web Service的异常。本文讲述如何通过SoapExceptionHelper实现一致的异常处理。

Web Service的异常处理问题
在.Net中实现Web服务时,Web服务接口中产生的任何用户异常(非SoapException之外的异常)都被包装为SoapException传递给客户端 ,用户错误信息放置在SoapException的Message属性中。

下面的例子演示了一个SoapException封装的用户异常信息。WebMethod接口TestException代码抛出一个InvalidOperationException:

[WebMethod]
public void TestException() {
throw new InvalidOperationException("Invalid Operation.");
}

WebMethod的客户端将捕获一个SoapException异常,Message消息如下:



其中Message消息包含一段“...-->[ 1 ]:[ 2 ] at ....”的信息,[1]为用户异常类,[2]为用户异常消息。而一个原始的SoapException(用new SoapException(...)的方式创建并抛出的异常)则没有这些信息,下面是一个原始的SoapException消息:



遗憾的是,目前的SoapException并没有提供更多直接的手段直接获取原来的异常信息,唯一包含的用户异常信息在Message字符串中,对于使用Web Service作为分布式机制的应用系统来说是非常不方便的,调用者无法捕获原来的异常,难以获取用户友好的异常信息。同时,因为Web Service接口代理不再抛出原来的异常,应用的开发者需要考虑两套完全不同的异常处理机制,带来了程序结构的复杂性。

创建SoapException辅助类:SoapExceptionHelper
SoapExceptionHelper辅助类包含下列主要接口:

IsUserException:是否是一个UserException
UserException:返回原始的UserException
Message:原始异常的错误消息。
获得原始的用户异常类和异常消息
通过正则表达式类我们可以获得原始的用户异常类和异常消息:

/// <summary>
/// 读取UserException信息。
/// </summary>
private void ReadUserExceptionInfo() {
//match user exception class
System.Text.RegularExpressions.MatchCollection mc =
Regex.Matches(soapException.Message, "---> ([^:]+):");
if (mc.Count >= 1) {
userExceptionClass = mc[0].Groups[1].Value;
//match user exception message
mc = Regex.Matches(soapException.Message, "---> [^:]+:(.*)/n");
if (mc.Count > 0) UserExceptionMessage = mc[0].Groups[1].Value;
}
}

创建用户异常实例
UserException接口利用反射机制创建一个原来的Exception类实例:

... ...
Assembly callingAssemply = Assembly.GetCallingAssembly();
Type exceptionType = GetExceptionType(callingAssemply); //获得用户异常类型定义
Exception e = null;
try {
try {
e = Activator.CreateInstance(exceptionType, new object[]{UserExceptionMessage}, null) as Exception;
}
catch {}
//if no exists constructor with message parameter, use no parameters constructor.
if (e == null) e = Activator.CreateInstance(exceptionType) as Exception;
}catch(Exception ex) {
throw new SoapExceptionHelperException(userExceptionClass, ex);
}

return e;

创建用户异常的问题
因为用户异常可能定义在不同的集成块中,SoapExceptionHelper可能无法知道它的位置,无法正确的获取异常类型,如一个与SoapExceptionHelper所在集成块和调用集成块(CallingAssembly)不再同一个引用范围内的异常类。SoapExceptionHelper如果无法创建原始异常的实例,就创建一个System.Exception对象实例。

为了创建真正的原始异常类,调用者可以在外部获得实际的异常类型,并传递给SoapExceptionHelper,因为调用者可以明确的引用异常定义 所在的集成块。示例如下:

// 项目引用中引入异常定义所在的集成块
...
SoapExceptionHelper helper = new SoapExceptionHelper(se);
Type type = Type.GetType(helper.UserExceptionClass, "<异常类所在的集成块>");
Exception e = helper.GetUserException(type);

如果外部没有传递异常类型定义,SoapExceptionHelper尝试以以下顺序获取异常类型定义:

Executing Assembly
Calling Assembly
Referenced Assemblies (of Calling Assembly)
System.Exception
使用SoapExceptionHelper
返回用户友好的消息
使用SoapExceptionHelper显示示例1中的错误消息:

try {
... ... // call web method
} catch (SoapException se){
MessageBox.Show(new SoapExceptionHelper(se).Message) ; //show "Invalid Operation." string
}
 

屏蔽SoapException
Web Service客户端代理类可以在捕获SoapException后重新抛出原来的异常,使用这种机制,可以有效的屏蔽Web Service异常处理的差异,使应用程序采用一致的本地方式处理异常。下面的代码修改Visual Studio生成的Web Service Client Proxy Class(Reference.cs文件)实现了这种机制(加粗的部分为新增的代码):

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/TestException", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public void TestException() {
try{
this.Invoke("TestException", new object[0]);
}catch(SoapException se){
SoapExceptionHelper helper = new SoapExceptionHelper(se);
if (helper.IsUserException) throw helper.UserException; //rethrow user exception
else throw;
}
}
分享到:
评论

相关推荐

    Java Web项目整体异常处理机制

     出来工作一年时间了,我也大概对异常处理有了一些了解,在这呢小弟简单介绍下个人对异常处理的见解,抛砖引玉,希望各位大神提出宝贵的意见和建议。  拿spring+struts2+hibernate项目说明:通常一个页面请求到...

    精品课件 Python从入门到精通 第20章 Web编程(共14页).pptx

    Python从入门到精通 第12章 异常处理及程序调试.ppt Python从入门到精通 第13章 文件及目录操作.ppt Python从入门到精通 第14章 操作数据库.ppt Python从入门到精通 第15章 GUI界面编程.pptx Python从入门到精通 第...

    ASP.NET State service状态服务的问题解决方法

    异常详细信息: System.Web.HttpException: 无法向会话状态服务器发出会话状态请求。... 这是因为ASP.NET State service状态服务没有打开,因此在执行当前 Web 请求期间生成了未处理的异常。 解决方法: 方法

    C#电子教案

    第44讲:Web应用程序的调试和异常处理 第45讲:Web应用程序的部署和配置 第46讲:Web应用程序的安全性 第47讲:Web Service介绍 第48讲:Web Service应用 第49讲:ADO.NET概述 第50讲:ADO.NET重要对象 第51讲:SQL ...

    Delphi讲义 chm格式

    二、异常处理 三、创建DLL 动态连接库 四、创建VCL 组件 五、COM 技术 六、ActiveX 控件 七、数据库开发(ADO、BDE和dbExpress) 八、多线程编程 九、分布式多层数据库开发(MIDAS技术和DataSnap) ...

    21天学会C# 入门教程

    第三篇主要分析了C# Web开发的内容,主要包括Web应用程序开发、Web应用程序的调试和异常处理、Web应用程序的部署和配置、Web应用程序的安全性和用C#开发 Web Service;第四篇是数据操作篇,主要内容包括ADO.NET 3.5...

    21天学通C#

    第三篇主要分析了C# Web开发的内容,主要包括Web应用程序开发、Web应用程序的调试和异常处理、Web应用程序的部署和配置、Web应用程序的安全性和用C#开发Web Service;第四篇是数据操作篇,主要内容包括ADO.NET 3.5...

    WebService处理大数据量数据.pdf

    WebService处理⼤数据量数据 处理⼤数据量数据 在通过WebService处理⼤数据量数据时出现如下错误: soap fault: 运⾏配置⽂件中指定的扩展时出现异常。 ---&gt; 超过了最⼤请求长度。 解决⽅法: 因为上传的⽂件⼤于...

    21天学通C# 源码第二部分

    第三篇主要分析了C# Web开发的内容,主要包括Web应用程序开发、Web应用程序的调试和异常处理、Web应用程序的部署和配置、Web应用程序的安全性和用C#开发Web Service;第四篇是数据操作篇,主要内容包括ADO.NET 3.5...

    RapidWebDev框架源码

    提供了许多有用的工具,如:缓存,事物处理,验证,异常处理,日志,Linq DataContext工厂,Restful web service等. 3. 系统架构 基于.NET Framework 3.5 SP1,并且使用的目前最新的技术开发。 全面支持SAAS ...

    poc-error-handling:POC,以便在不同的基于Web的技术中找到正确的设置来定义全局错误处理程序

    每个项目都公开一个引发异常的服务,以模拟应用程序未捕获的异常,然后模拟意外错误。 使用IDE 使用了以下IDE: 已使用创建了基于Java的项目(带有java-前缀的子文件夹)。 基于.Net的项目(带aspnet-前缀的子...

    ASP.NET AJAX

    导读:在UpdatePanel控件异步更新时,如果有错误发生,默认情况下会弹出一个Alert对话框显示出错误信息,这对用户来说是不友好的,本文看一下如何在服务端和客户端脚本中自定义异常处理,翻译自官方文档。...

    ABP生成的初始框架

    1.2.11 统一异常处理,应用层不需要自己写异常处理代码 1.2.12 提供针对Application层方法的参数有效性认证 1.2.13 通过Application Service创建Web API层,无需编写ApiController 1.2.14 提供基类帮助用户实现...

    spring in action英文版

     6.6.2 在Spring里置入一个Web Service  6.7 小结  第7章 访问企业服务  7.1 从JNDI中获取对象  7.1.1 使用传统的JNDI  7.1.2 代理JNDI对象  7.2 发送电子邮件  7.3 调度任务  7.3.1 使用...

    高级Java软件架构师学习计划

    异常处理与事件响应 Java基础类库与中期项目实战 Java多线程编程、网络编程 项目实战 J2EE中级 数据库基础与linux操作系统 JDBC程序开发 JavaEE基础 JSP、SERVLET、JSTL 和 EL JavaBean/EJB MVC 设计模式与中期项目...

Global site tag (gtag.js) - Google Analytics