天天看點

yield在WCF中的錯誤使用——99%的開發人員都有可能犯的錯誤[上篇]

在定義API的時候,對于一些傳回集合對象的方法,很多人喜歡将傳回類型定義成IEnumerable<T>,這本沒有什麼問題。這裡要說的是另一個問題:對于傳回類型為IEnumerable<T>的方法來說,我們可以使用yield

return的方式來輸出傳回集合的元素。但是如果我們不了解yield 關鍵字背後的實作機制,很有可能造成很大的問題。

這是一個WCF相關的問題,我想99%的人都有可能會犯這樣的錯誤——即使你對yield了解得非常透徹。閑話少說,我們通過一個簡單的執行個體來說明這個問題。我們定義了如下一個IDemoService接口作為服務契約,唯一的方法GetItems傳回一個類型為IEnumerable<string>對象,并且具有唯一字元串參數category。

下面是實作了該契約接口的DemoService的實作:GetItems方法傳回一個包含3個字元串的集合,但是在傳回之前我們需要對參數實施驗證。如果category參數提供的字元串為Null或者是空字元串,抛出一個FaultException異常并提示“Invalid

Category”,這樣用戶端在輸入不合法參數的情況下可以得到錯誤消息。這樣的程式設計方式再正常不過了,不是嗎?

可是正常并不意味着正确,用戶端其實根本無法得到服務端提供給它的錯誤消息,如下所示的是用戶端調用服務時指定一個空字元串參數情況下得到的錯誤。一個CommunicationException異常被抛出來,得到的錯誤消息為“An

This could be due to the service endpoint binding not using the HTTP

protocol. This could also be due to an HTTP request context being

aborted by the server (possibly due to the service shutting down). See

server logs for more details.”

yield在WCF中的錯誤使用——99%的開發人員都有可能犯的錯誤[上篇]

這貌似和我們預期的效果不一樣,我們希望的是用戶端抛出一個FaultException,并提示“Invalid

category”。這實際上就是因為“yield”在作祟,不相信的話可以将定義在DemoService的GetItems方法替換成如下的定義,即直接傳回一個string[]對像。

再次運作我們的程式,這回可以得到我們期望的結果了。

yield在WCF中的錯誤使用——99%的開發人員都有可能犯的錯誤[上篇]

<a href="http://www.cnblogs.com/artech/archive/2013/04/12/yield-in-wcf.html">yield在WCF中的錯誤使用——99%的開發人員都有可能犯的錯誤[上篇]</a>

<a href="http://www.cnblogs.com/artech/archive/2013/04/14/yield-in-wcf-02.html">yield在WCF中的錯誤使用——99%的開發人員都有可能犯的錯誤[下篇]</a>

作者:蔣金楠

微信公衆賬号:大内老A

如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識别二維碼)關注個人公衆号(原來公衆帳号蔣金楠的自媒體将會停用)。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

<a href="http://www.cnblogs.com/artech/archive/2013/04/12/yield-in-wcf.html" target="_blank">原文連結</a>

繼續閱讀