天天看點

關于Silverlight 調用WCF/Rest的異常

建立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,如需轉載請自行聯系原作者