人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

C#:Web Service異常處理

C#:Web Service異常處理

更新時間:2022-06-06 文章作者:未知 信息來源:網絡 閱讀次數:

在.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;
}
}

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 车致| 紫金县| 华阴市| 阳东县| 东明县| 太仆寺旗| 新野县| 牟定县| 青海省| 无锡市| 长顺县| 天峻县| 女性| 上林县| 雅江县| 茂名市| 从化市| 宁安市| 阳新县| 诸暨市| 繁峙县| 环江| 平塘县| 台中市| 黔西县| 肇东市| 渭南市| 嘉峪关市| 芜湖市| 鹰潭市| 财经| 磐安县| 天长市| 凌源市| 宜黄县| 嘉善县| 墨江| 道孚县| 宜宾县| 北海市| 开封市|