最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# yield在WCF中的錯誤用法(一)

 更新時間:2015年04月10日 11:09:01   投稿:junjie  
這篇文章主要介紹了C# yield在WCF中的錯誤使用(一),本文講解的內(nèi)容據(jù)說是99%的開發(fā)人員都有可能犯的錯誤,需要的朋友可以參考下

在定義API的時候,對于一些返回集合對象的方法,很多人喜歡將返回類型定義成IEnumerable<T>,這本沒有什么問題。這里要說的是另一個問題:對于返回類型為IEnumerable<T>的方法來說,我們可以使用yield return的方式來輸出返回集合的元素。但是如果我們不了解yield 關(guān)鍵字背后的實現(xiàn)機制,很有可能造成很大的問題。

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

復(fù)制代碼 代碼如下:

  [ServiceContract]
  public interface IDemoService
  {
      [OperationContract]
      IEnumerable<string> GetItems(string category);
  }

下面是實現(xiàn)了該契約接口的DemoService的實現(xiàn):GetItems方法返回一個包含3個字符串的集合,但是在返回之前我們需要對參數(shù)實施驗證。如果category參數(shù)提供的字符串為Null或者是空字符串,拋出一個FaultException異常并提示“Invalid Category”,這樣客戶端在輸入不合法參數(shù)的情況下可以得到錯誤消息。這樣的編程方式再正常不過了,不是嗎?
復(fù)制代碼 代碼如下:

public class DemoService : IDemoService
{
    public IEnumerable<string> GetItems(string categoty)
    {
        if (string.IsNullOrEmpty(categoty))
        {
            throw new FaultException("Invalid category");
        }
        yield return "Foo";
        yield return "Bar";
        yield return "Baz";
    }
}

可是正常并不意味著正確,客戶端其實根本無法得到服務(wù)端提供給它的錯誤消息,如下所示的是客戶端調(diào)用服務(wù)時指定一個空字符串參數(shù)情況下得到的錯誤。一個CommunicationException異常被拋出來,得到的錯誤消息為“An error occurred while receiving the HTTP response to http://127.0.0.1:3721/demoservice. 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.”

這貌似和我們預(yù)期的效果不一樣,我們希望的是客戶端拋出一個FaultException,并提示“Invalid category”。這實際上就是因為“yield”在作祟,不相信的話可以將定義在DemoService的GetItems方法替換成如下的定義,即直接返回一個string[]對像。

復(fù)制代碼 代碼如下:

public class DemoService : IDemoService
{
    public IEnumerable<string> GetItems(string categoty)
    {
        if (string.IsNullOrEmpty(categoty))
        {
            throw new FaultException("Invalid category");
        }
        return new string[] { "Foo", "Bar", "Baz" };
    }
}

再次運行我們的程序,這回可以得到我們期望的結(jié)果了。

有興趣的朋友可以思考一下為什么兩種貌似等效的方式為何會出現(xiàn)完全不同的結(jié)果,具體原因請看[下篇]。

相關(guān)文章

  • C# Record構(gòu)造函數(shù)的行為更改詳解

    C# Record構(gòu)造函數(shù)的行為更改詳解

    C# 9 中的record類型是僅具有只讀屬性的輕量級、不可變數(shù)據(jù)類型(或輕量級類),下面這篇文章主要給大家介紹了關(guān)于C# Record構(gòu)造函數(shù)的行為更改的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C#常用數(shù)據(jù)結(jié)構(gòu)之數(shù)組Array

    C#常用數(shù)據(jù)結(jié)構(gòu)之數(shù)組Array

    這篇文章介紹了C#常用數(shù)據(jù)結(jié)構(gòu)之數(shù)組Array,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C# XML操作類分享

    C# XML操作類分享

    這篇文章主要分享了C# XML操作類的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Unity 實現(xiàn)給物體替換材質(zhì)球

    Unity 實現(xiàn)給物體替換材質(zhì)球

    這篇文章主要介紹了Unity 實現(xiàn)給物體替換材質(zhì)球的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#中DataSet,DataTable,DataView的區(qū)別與用法

    C#中DataSet,DataTable,DataView的區(qū)別與用法

    這篇文章介紹了C#中DataSet,DataTable,DataView的區(qū)別與用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#使用itextsharp生成PDF文件的實現(xiàn)代碼

    C#使用itextsharp生成PDF文件的實現(xiàn)代碼

    以下是對在C#中使用itextsharp生成PDF文件的實現(xiàn)代碼進行了詳細分析介紹,需要的朋友可以過來參考下
    2013-07-07
  • C#實現(xiàn)將應(yīng)用程序設(shè)置為開機啟動的方法

    C#實現(xiàn)將應(yīng)用程序設(shè)置為開機啟動的方法

    這篇文章主要介紹了C#實現(xiàn)將應(yīng)用程序設(shè)置為開機啟動的方法,涉及C#針對注冊表的寫入技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • Unity性能優(yōu)化Shader函數(shù)ShaderUtil.GetShaderGlobalKeywords用法示例

    Unity性能優(yōu)化Shader函數(shù)ShaderUtil.GetShaderGlobalKeywords用法示例

    這篇文章主要為大家介紹了Unity性能優(yōu)化Shader函數(shù)ShaderUtil.GetShaderGlobalKeywords用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 淺談C#中的Async和Await的用法詳解

    淺談C#中的Async和Await的用法詳解

    這篇文章主要介紹了淺談C#中的Async和Await的用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Unity3D開發(fā)教程:憤怒的小鳥

    Unity3D開發(fā)教程:憤怒的小鳥

    這篇文章詳細的講解了如何從0開發(fā)出一個Unity3D的小游戲憤怒的小鳥,本文包含大量的圖片與文字描述,也含有大量的源代碼,可以讓你快速入手,希望本篇文章對你有所幫助
    2021-06-06

最新評論

呈贡县| 栾川县| 同德县| 公安县| 新宾| 丹江口市| 北川| 南通市| 临桂县| 上犹县| 远安县| 内乡县| 稻城县| 章丘市| 沅江市| 皮山县| 兴城市| 安龙县| 东至县| 景洪市| 齐齐哈尔市| 莎车县| 普兰店市| 绥化市| 栾城县| 麻栗坡县| 庐江县| 维西| 长治县| 兰溪市| 瑞安市| 高青县| 潜山县| 灌云县| 景泰县| 冕宁县| 绵阳市| 武强县| 库尔勒市| 和平区| 建湖县|