2012-09-05

WCF序列化自訂物件所引發的例外狀況

在WCF Client呼叫 WCF Service 的特定Method時,會發生 CommunicationException,錯誤訊息為「基礎連接已關閉: 連接意外關閉。」,但使用Debug模式Trace進Service內部,又會發現該Method是有正常執行結束的,也沒有任何Exception發生....



若用 wcftestclient 工具測試的話,甚至會跟你說,可能是configuration的問題,乍看之下,就笨笨的去找EndPoint, Proxy, Binding....等等的問題,花了大半天,最後發現問題是出現在Contract這一環。

以我的例子來說,要return給WCF Client的是「自訂物件」,又由於懶得寫DataContract,所以大多都用WCF的預設序列化動作去做,大多也都是POCO型態,因為某些因素,此method回傳的自訂物件必需增加「屬性」,加了這些屬性後就有這狀況,而該屬性是另一個自訂Type,由於該Type並無法以預設的序列化動作做序列化,因此造成了這個錯誤。

但是給的Exception訊息裡,看不出來任何跟「序列化」相關的keyword,Stack Trace也都是Channel、Proxy之類的字眼,所以下次遇到此狀況又無從下手時,可以試著去看看最終回傳的type,對於序列化所該做的Contract定義是否完整。


參考連結:
*在此推薦及感謝史帝芬心得筆記這個blog,有很多關於WCF的文章值得參考學習。

沒有留言:

張貼留言

引用 Topshelf 無法進行偵錯的經驗

Topshelf  是一個可以簡化撰寫 Windows Service 的套件,引用之後,我們只要當作撰寫一般 Console 的應用程式就可以。 只是近來撰寫上遇到無法進行Debug的狀況,在Visual Studio一進行偵錯可以看到Console 程式被執行,並顯示...