亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

正確捕獲 WCF服務調用中發生的異常及處理技巧

2019-11-17 03:52:46
字體:
來源:轉載
供稿:網友
概述:本節主要講述在服務調用中可能發生的異常及模擬異常的發生,并分析何時可捕獲何種異常,以及如何把服務異常以正確的方式傳遞到客戶端,

          文章最后給出正確捕獲異常的捕獲順序。本次異常捕獲僅為介紹,部分為應用性功能,所以代碼和行文相對簡單,還介紹了在服務器端異常處理的一些技巧。

1、  首先,我們創建一個簡單的計算器服務器和客戶端,如下:



點擊展開代碼
//服務器[ServiceContract]public interface ICalc{[OperationContract][FaultContract(typeof(GreentingError))]string Div(int x, int y);}public class Calc : ServiceBase, ICalc    {public string Div(int x, int y)        {string result = string.Empty;            try            {result = string.Format("result: {0}", x / y); } catch (DivideByZeroException ex)            {throw ex; }return result; }}//客戶端[ServiceContract]    public interface ICalc    {        [OperationContract]        [FaultContract(typeof(GreentingError))]        string Div(int x, int y);    }public class CalcClient : ClientBase<ICalc>, ICalc{ public string Div(int x, int y) {return base.Channel.Div(x, y); }}
好吧,我承認代碼相當的簡單,不過我喜歡簡潔的東西。





2、 簡單的東西就是好,調用都簡單得多;我們來調用一下。       

        try            {                CalcClientcalcclient = new CalcClient();                string result =calcclient.Div(10, 0);                Console.WriteLine(result);                Console.ReadKey();            }            catch (TimeoutExceptionex) {throw ex; }            catch (FaultException<GreentingError> ex) {throw ex; }            catch (FaultExceptionex) {throw ex;            catch (System.ServiceModel.CommunicationException ex) {throw ex; }            catch (Exceptionex) {throw ex; }





3、當我們在調用服務的Div(int x,int y)方法并給對數y傳遞了值為0后,服務器端將會引發DivideByZeroException的異常,這在預料之中。這時候,

在客戶端的FaultException部分捕獲了這個異常。



4、沒問題,我們再在服務器代碼中手動拋出FaultException異常。



catch (DivideByZeroException ex){FaultException exception = new FaultException(ex.Message); throw exception;}


這時候發現,還是FaultException捕獲了這個異常,為何?



5、再做一個測試。

在服務加入這句代碼:System.Threading.Thread.Sleep(70000);使得服務超時。

這回終于是TimeOutException捕獲了服務器的異常,那么我們就要問了,FaultException< GreentingError>何時會捕獲異常呢?答案是當服務器拋出FaultException< GreentingError>的時候,引用MSDN上的一段話(綠色部分):

如果偵聽器接收到操作協定中不期望或未指定的 SOAP 錯誤,將會引發 FaultException對象, 可以發送兩種類型的 SOAP 錯誤:已聲明的和未聲明的。 已聲明的 SOAP 錯誤是指其中的某個操作具有System.ServiceModel.FaultContractAttribute屬性(用于指定自定義 SOAP 錯誤類型)的錯誤。 未聲明的 SOAP 錯誤是在操作的協定中沒有指定的錯誤。這里的“不期望或未指定的 SOAP 錯誤”是指未在服務操作中應用FaultContractAttribute包裝的自定義錯誤類型。



6、那么何時會捕獲CommincationException異常呢?

MSDN上說是:應用程序處理在通信期間可能會引發的 CommunicationException 對象

好吧,為了引發這個異常,我們來作如下操作。首先在服務器關閉當前通道對象。



OperationContext.Current.Channel.Close();
很遺憾,客戶端并沒有捕獲到CommunicationException,而是捕獲到了TimeOutException異常!因為服務通道關閉后,并未發生異常,所以沒有返回消息到客戶端,客戶端在等待一定時間后,超時退出。



所以我們在關閉通道的同時指定一個TimeSpan。這樣可以讓調用立即返回,當然,還可以通過Channel.Abort來完成調用返回。



OperationContext.Current.Channel.Close(new TimeSpan(5000));


在調用了IContextChannel的Close方法的同時,指定在超時前必須完成發送操作的時間,這樣可以使得消息在指定時間內立即返回,而不必等到服務調用超時,否則到時客戶端必將引發TimeOutException異常,而不是CommunicationException異常。

7、補救措施

同時,為了在服務出現異常時我們可以采取一些補救的措施,我們新建了一個抽象類ServiceBase,并使得Calc服務實現類繼承自它,這樣我們就可以在服務各種狀態轉換中取得控制權。ServiceBase類如下:




public abstract partial class ServiceBase    {        PRivate IContextChannel channel = null;        protected ServiceBase()        {            channel = OperationContext.Current.Channel;            channel.Opening += new EventHandler(delegate(object sender, EventArgs e) {/* TO DO*/ });            channel.Opened += new EventHandler(delegate(object sender, EventArgs e) {/* TO DO*/ });            channel.Closing += new EventHandler(delegate(object sender, EventArgs e) {/* TO DO*/ });            channel.Closed += new EventHandler(delegate(object sender, EventArgs e) { Abort(); });            channel.Faulted += new EventHandler(delegate(object sender, EventArgs e) { Abort(); });        }        void Open() {/* TO DO*/ }        void Close() { /* TO DO*/}        void Abort() { channel.Abort(); }}


從上面的代碼中可以看出,在服務通道關閉以后,我們立即將服務中止,讓消息立即返回,這時候即使在操作中關閉了服務而又未指定超時完成的時間,調用依然可以立即返回。

這次客戶端總算捕獲到了CommunicationException異常,見下圖:



為何會這樣?



8、讓我們來看一下CommunicationException的繼承層次,從中我們可以得到啟示。

8.1、首先是FaultException<TDetail>的繼承層次。



8.2、再次是TimeOutException的繼承層次。



9、從上圖中可以看出,TimeOutException和CommunicationException均繼承自SystemException類,而FaultException繼承自CommunicationException,最后是FaultException<TDetail>繼承自FaultException類。

10、最后我們得出,在客戶端正確的捕獲異常的順序應該是:

TimeOutException> FaultException<TDetail> > FaultException >CommunicationException > Exception。在這里強烈建議開發人員拋出和捕獲FaultException<TDetail>類型的異常。

作者:老米
    
出處:http://www.49028c.com/viter/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最新国产精品亚洲| 亚洲美女性视频| 久久久www成人免费精品| 久久久久免费精品国产| 欧美黑人xxxⅹ高潮交| 日韩精品久久久久| 国产+成+人+亚洲欧洲| 亚洲欧洲免费视频| 精品国产91乱高清在线观看| 精品视频久久久久久久| 久久精品视频导航| 欧美电影《睫毛膏》| 亚洲欧美另类自拍| 亚洲精品国偷自产在线99热| 91高清视频在线免费观看| 欧美福利视频在线观看| 亚洲国产成人在线视频| 亚洲精品动漫久久久久| 亚洲一区av在线播放| 一本色道久久综合狠狠躁篇怎么玩| 91精品国产综合久久香蕉922| 久久久国产精彩视频美女艺术照福利| 北条麻妃一区二区在线观看| 国产精品免费一区二区三区都可以| 国产综合色香蕉精品| 日韩一区二区av| 亚洲欧洲日本专区| 国产亚洲精品美女久久久| 欧美日韩在线视频一区二区| 日韩av在线资源| 国产日韩精品一区二区| 国产成人+综合亚洲+天堂| 91精品久久久久久久久中文字幕| 国产欧美精品在线播放| 亚洲人午夜精品免费| 色老头一区二区三区在线观看| 欧美性猛交视频| 国产视频久久久久久久| 亚洲免费视频在线观看| 国产91精品视频在线观看| 国产性色av一区二区| 成人字幕网zmw| 国产精品视频公开费视频| 国产一区二区三区四区福利| 日韩美女在线观看一区| 欧美激情a∨在线视频播放| 成人免费xxxxx在线观看| 国产欧美久久一区二区| 久久手机免费视频| 岛国av一区二区三区| 青青草99啪国产免费| 欧美精品在线播放| 2020久久国产精品| 青草青草久热精品视频在线观看| 欧美激情手机在线视频| 久久69精品久久久久久久电影好| 中文字幕免费精品一区| 日韩在线观看网址| 国产精品成人免费视频| 欧美高清在线观看| 中文字幕免费精品一区| 最新国产精品拍自在线播放| 热99精品只有里视频精品| 国产精品日韩欧美大师| 国产偷亚洲偷欧美偷精品| 一区二区三区视频免费| 亚洲国产成人精品一区二区| 国产成人福利夜色影视| 成人免费网站在线看| 久热国产精品视频| 97成人精品区在线播放| 国产成人高清激情视频在线观看| 色偷偷av一区二区三区乱| 亚洲精品国精品久久99热一| 亚洲级视频在线观看免费1级| 国产成人午夜视频网址| 国产精品视频一区二区三区四| 国产成人极品视频| 91极品女神在线| 国内精品久久久久伊人av| 亚洲性生活视频在线观看| 国产成人精品免高潮在线观看| 国产欧美va欧美va香蕉在线| 国产精品嫩草影院一区二区| 日韩亚洲欧美成人| 久久青草福利网站| 国产精品九九九| 亚洲精品久久久久久久久久久久| 欧美性精品220| 国产亚洲精品久久久久久牛牛| 欧美日韩在线视频一区| 毛片精品免费在线观看| 国产精品视频网| 国产香蕉精品视频一区二区三区| 精品magnet| 国产日韩欧美在线视频观看| 色yeye香蕉凹凸一区二区av| 日韩精品视频在线播放| 亚洲精品福利免费在线观看| 亚洲国产小视频| 日韩欧美在线第一页| 亚洲人成在线电影| 国产精品中文久久久久久久| 尤物精品国产第一福利三区| 清纯唯美亚洲综合| 久久精品美女视频网站| 亚洲偷熟乱区亚洲香蕉av| 国产欧美日韩专区发布| 欧美放荡办公室videos4k| 日韩在线不卡视频| 亚洲视频在线观看视频| 日韩欧美中文第一页| 欧美日韩成人在线视频| 日本视频久久久| 亚洲一区中文字幕| 国产精品成人一区二区| 久久久久久久久久国产| 精品国产一区二区三区久久久| 国产成人在线播放| 国产热re99久久6国产精品| 国产亚洲精品久久久优势| 国产精品久久久久久搜索| 亚洲美女久久久| 国产偷国产偷亚洲清高网站| 国产精品极品尤物在线观看| 91免费精品视频| 国产精品专区第二| 久久青草精品视频免费观看| 日日狠狠久久偷偷四色综合免费| 欧美精品一区二区三区国产精品| 国产精品黄页免费高清在线观看| 91久久久久久久| 国产性色av一区二区| 欧美激情精品久久久久久黑人| 91精品久久久久久久久青青| 9.1国产丝袜在线观看| 国产精品视频不卡| 81精品国产乱码久久久久久| 国产成人黄色av| 久久久久久97| 一级做a爰片久久毛片美女图片| 国产精品久久久久999| 中文字幕日韩有码| 亚洲一区二区三区乱码aⅴ| 亚洲免费视频在线观看| 国a精品视频大全| 久热精品视频在线免费观看| 中文字幕精品久久| www.欧美三级电影.com| 国产视频一区在线| 欧美日韩激情网| 欧美日韩国产第一页| 中文字幕在线观看亚洲| 久久久亚洲影院| 欧美亚洲第一区| 日韩在线视频导航| 成人av资源在线播放| 欧美亚洲国产视频| 欧美日韩加勒比精品一区| 亚洲а∨天堂久久精品9966| 97精品国产97久久久久久春色| 国产亚洲精品久久久| 国产一区二区三区中文| 国产一级揄自揄精品视频|