成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C# Web Service異常處理的兩個常見問題

開發 后端
創建用戶異常和Web Service的異常處理的問題是C# Web Service異常處理的兩個常見問題,本文將向您介紹如何通過SoapExceptionHelper實現一致的異常處理。

在.Net中實現Web服務時,在Web服務接口中產生的任何用戶異常(非SoapException之外的異常)都被包裝為SoapException傳遞給客戶端,這使得難以采用通常的方式處理Web Service的異常。本文講述如何通過SoapExceptionHelper實現一致的異常處理。

C# Web Service異常處理問題

在.Net中實現Web服務時,Web服務接口中產生的任何用戶異常(非SoapException之外的異常)都被包裝為SoapException傳遞給客戶端 ,用戶錯誤信息放置在SoapException的Message屬性中。

下面的例子演示了一個SoapException封裝的用戶異常信息。WebMethod接口TestException代碼拋出一個InvalidOperationException:

  1. [WebMethod]   
  2. public void TestException() {   
  3. throw new InvalidOperationException  
  4. ("Invalid Operation.");   
  5. }   

WebMethod的客戶端將捕獲一個SoapException異常,Message消息如下:

其中Message消息包含一段“...-->[ 1 ]:[ 2 ] at ....”的信息,[1]為用戶異常類,[2]為用戶異常消息。而一個原始的SoapException(用new SoapException(...)的方式創建并拋出的異常)則沒有這些信息,下面是一個原始的SoapException消息:

遺憾的是,目前的SoapException并沒有提供更多直接的手段直接獲取原來的異常信息,唯一包含的用戶異常信息在Message字符串中,對于使用Web Service作為分布式機制的應用系統來說是非常不方便的,調用者無法捕獲原來的異常,難以獲取用戶友好的異常信息。同時,因為Web Service接口代理不再拋出原來的異常,應用的開發者需要考慮兩套完全不同的異常處理機制,帶來了程序結構的復雜性。

創建SoapException輔助類:SoapExceptionHelper 來解決C# Web Service異常處理

SoapExceptionHelper輔助類包含下列主要接口:

  1. IsUserException:是否是一個UserException   
  2. UserException:返回原始的UserException   
  3. Message:原始異常的錯誤消息。   
  4. 獲得原始的用戶異常類和異常消息   
  5. 通過正則表達式類我們可以獲得原始的用戶異常類和異常消息:   
  6.  
  7. ///    
  8. /// 讀取UserException信息。   
  9. /// 
  10.    
  11. private void ReadUserExceptionInfo() {   
  12. //match user exception class   
  13. System.Text.RegularExpressions.  
  14. MatchCollection mc = Regex.Matches  
  15. (soapException.Message, "---> ([^:]+):");   
  16. if (mc.Count >= 1) {   
  17. userExceptionClass = mc[0].Groups[1].Value;   
  18. //match user exception message   
  19. mc = Regex.Matches(soapException.  
  20. Message, "---> [^:]+:(.*)\n");   
  21. if (mc.Count > 0) UserExceptionMessage   
  22. = mc[0].Groups[1].Value;   
  23. }   
  24. }   
  25.  
  26. 創建用戶異常實例   
  27. UserException接口利用反射機制創建  
  28. 一個原來的Exception類實例:   
  29.  
  30. ... ...   
  31. Assembly callingAssemply = Assembly.  
  32. GetCallingAssembly();   
  33. Type exceptionType = GetExceptionType  
  34. (callingAssemply); //獲得用戶異常類型定義   
  35. Exception e = null;   
  36. try {   
  37. try {   
  38. e = Activator.CreateInstance(exceptionType,   
  39. new object[]{UserExceptionMessage},   
  40. nullas Exception;   
  41. }   
  42. catch {}   
  43. //if no exists constructor with message parameter,   
  44. use no parameters constructor.   
  45. if (e == null) e = Activator.CreateInstance  
  46. (exceptionType) as Exception;   
  47. }catch(Exception ex) {   
  48. throw new SoapExceptionHelperException  
  49. (userExceptionClass, ex);   
  50. }   
  51.  
  52. return e;   

創建用戶異常的問題

因為用戶異常可能定義在不同的集成塊中,SoapExceptionHelper可能無法知道它的位置,無法正確的獲取C# Web Service異常處理類型,如一個與SoapExceptionHelper所在集成塊和調用集成塊(CallingAssembly)不再同一個引用范圍內的異常類。SoapExceptionHelper如果無法創建原始異常的實例,就創建一個System.Exception對象實例。

為了創建真正的原始異常類,調用者可以在外部獲得實際的異常類型,并傳遞給SoapExceptionHelper,因為調用者可以明確的引用異常定義 所在的集成塊。示例如下:

  1. // 項目引用中引入異常定義所在的集成塊   
  2. ...   
  3. SoapExceptionHelper helper =   
  4. new SoapExceptionHelper(se);   
  5. Type type = Type.GetType(helper.  
  6. UserExceptionClass, "<異常類所在的集成塊>");   
  7. Exception e = helper.GetUserException(type);   
  8.  
  9. 如果外部沒有傳遞異常類型定義,  
  10. SoapExceptionHelper嘗試以以下順序獲取異常類型定義:   
  11. Executing Assembly   
  12. Calling Assembly   
  13. Referenced Assemblies (of Calling Assembly)   
  14. System.Exception   
  15. 使用SoapExceptionHelper   
  16. 返回用戶友好的消息   
  17. 使用SoapExceptionHelper顯示示例1中的錯誤消息:   
  18. try {   
  19. ... ... // call web method   
  20. } catch (SoapException se){   
  21. MessageBox.Show(new SoapExceptionHelper(se).  
  22. Message) ; //show "Invalid Operation." string   

【編輯推薦】

  1. C#中定義裝箱和拆箱詳解
  2. 淺談C#類型系統
  3. 三種不同的C#異常類型
  4. 詳細介紹C#編譯器
  5. C#異常機制的相關解釋
責任編輯:冰荷 來源: jpinw
相關推薦

2015-05-15 09:37:24

iOS開發爭議

2022-07-01 13:17:13

Docker

2009-08-20 15:38:50

C#建立Web Ser

2016-12-22 15:31:47

數據中心監控自動化警報

2009-08-11 13:27:22

C#創建Web Ser

2020-05-25 22:41:27

LoRaWAN物聯網技術物聯網

2013-05-23 10:23:04

DebianDebian 7.0

2009-06-15 17:05:03

C#基元類型

2009-08-05 18:28:05

C#異常處理

2009-11-05 12:45:25

WCF異常

2009-08-06 14:08:08

C#語言異常處理

2009-08-31 17:26:32

C#異常處理

2013-01-06 10:43:07

Linux集群

2009-08-12 16:37:22

C#變量類型轉換

2014-08-25 10:24:01

Linux

2019-09-25 14:48:03

區塊鏈以太坊比特幣

2009-08-11 11:07:49

Java調用C# we

2015-11-16 09:12:40

android問題開發

2011-02-22 14:00:16

vsftpd

2009-08-11 13:07:26

C#類庫中添加Web
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产免费一区二区 | 久久久精品一区二区三区 | 巨大黑人极品videos精品 | 日日干综合 | 亚洲视频一区在线播放 | 国内自拍偷拍视频 | 天天操精品视频 | 精品视频在线免费观看 | 人人澡人人射 | 国产精品高潮呻吟久久久久 | 成年人网站免费 | 精品亚洲一区二区 | 欧美国产日韩一区二区三区 | 日韩中文一区二区三区 | 久久精品一区二 | 亚洲色图综合 | 久久精品视频网站 | 国产精品久久 | 日韩精品久久久久久 | 国产一区| 视频一区在线观看 | 午夜www| 日韩在线观看视频一区 | 亚洲激精日韩激精欧美精品 | 91精品国产综合久久婷婷香蕉 | 久久久一二三区 | 久久亚 | 久久综合888 | 亚洲一区中文字幕 | 欧美日韩不卡合集视频 | 精品欧美一区二区在线观看视频 | 大陆一级毛片免费视频观看 | www.久草.com | 欧美一区二区在线 | 日本黄色激情视频 | 天天搞天天操 | 国产成人精品综合 | 99精品视频免费观看 | 亚洲成人精品 | 97人人超碰 | 国产一区日韩在线 |