C#:Web Service異常處理

來源:互聯網
上載者:User
web|異常處理 在.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:原始異常的錯誤訊息。
獲得原始的使用者異常類和異常訊息
通過Regex類我們可以獲得原始的使用者異常類和異常訊息:

/// <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;
}
}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.