建立Rest服務接口:
接着建立一個服務實作類:
在這裡讓Service1 抛出”divided by zero exception:”
在這裡注意<serviceDebug includeExceptionDetailInFaults="true" />
在Silverlight 用戶端添加服務引用,名稱為:ServiceReference1.
在頁面上添加一個按鈕,按鈕的Click事件代碼如下:
運作,結果如下:
<a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201106/201106201907069573.png"></a>
可以看到實際的異常是“嘗試除以0”,但是由于浏覽器限制,所有的異常都是NotFound。
在msdn上有兩種方法可以解決這個問題,
最簡單的就是在App.xaml.cs代碼裡面使用RegisterPrefix來<b>使用備用用戶端 HTTP </b><b>堆棧</b>
這是SL調用WCF服務如何處理異常的方式,那麼調用Rest服務呢?
首先要修改Web.config 節點下的serviceModel以讓它支援Rest。
在這裡要設定webHttp 節點的faultExceptionEnabled=true.并且設定serviceDebug 的includeExceptionDetailInFaults 為true。
OK,服務的Web.config檔案已經配置完畢了,接下來要為GetData方法添加WebGet特性修飾了。
運作:
<a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201106/201106201907251063.png"></a>
<a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201106/201106201907328758.png"></a>
可以看到得到了異常資訊了。
注意:别忘記了添加跨域和授權檔案:crossdomain.xml 和 clientaccesspolicy.xml 到網站根目錄。
同樣,修改SL用戶端頁面,添加一個Button,button的代碼事件為:
運作,點選btnRest
<a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201106/20110620190742895.png"></a>
可以看到,Rest 調用的結果仍然是NotFound。
提示讓我們檢視Response屬性和Status屬性。
就看看Respone屬性的ResponseStrem是什麼吧。
<a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201106/20110620190751706.png"></a>
可以看到errorMessage 就是傳回的錯誤,很明顯,我們需要對它反序列化成Exception的對象。
首先嘗試使用DataContractSerializer來反序列化為FaultException類
<a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201106/2011062019075870.png"></a>
因為我們嘗試反序列化為FaultException類,但是XML資料的Element名稱為Fault。是以失敗,難道是有Fault類 ?可是找了很久也沒發現Fault類。
但是在ReadObject方法中發現了一個verifyObjectName的重載。
将代碼修改為:
重新運作:
<a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201106/201106201908062815.png"></a>
可以發現雖然序列化是成功的,但是序列化後的值全部是錯誤的。
最後沒辦法既然有XML的異常資料,那麼可以嘗試解析xml資料并使用自定義異常。
首先建立SLFaultException 類,繼承Exception:代碼如下:
完整的代碼如下:
雖然序列化為FaultException是失敗的,但是xml節點的ExceptionDetail是可以被反序列回來的,當然上面的處理WebException的過程是可以被封裝的,讀者自己嘗試下吧,呵呵。
結果如下圖:
<a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201106/201106201908108294.png"></a>
本文轉自LoveJenny部落格園部落格,原文連結:http://www.cnblogs.com/LoveJenny/archive/2011/06/20/2085464.html,如需轉載請自行聯系原作者