2014-09-01 66 views
2

我有一個返回一個枚舉的WebApi控制器操作。我有一個MediaTypeFormatter掛鉤瞭解如何序列化這個枚舉。問題在於枚舉(被設計)懶洋洋地評估。這樣可以很好,除了枚舉必須在完成使用後才能處理。不幸的是,由於懶惰的評價,如果我做這樣的事情:序列化後ASP.NET WebApi操作處理?

public IEnumerable<MyClass> Get() 
{ 
    using (var disposableEnumerable = GetData()) 
    { 
     return disposableEnumerable; 
    } 
} 

串行得到它保持在此之前disposableEnumerable配置。這會導致序列化失敗,因爲源已被丟棄。

在另一方面,如果我不把它包裝在using語句,像這樣:

public IEnumerable<MyClass> Get() 
{ 
    return GetData(); 
} 

然後這是從來沒有佈置和我泄露的對象。

什麼是確保我的一次性處置序列化的最佳方式是什麼?

注意:在enumerable上調用ToList不是一個選項。我返回一個枚舉而不是具體列表的原因是出於內存原因。枚舉值很大,在枚舉過程中創建的對象也非常大。

回答

3

一些選項來實現這一目標:

  • 在你的行動做Request.RegisterForDispose(disposableEnumerable);。這將導致您的回覆被寫出後後可處理的。請注意,RegisterForDispose擴展名是System.Net.Http命名空間的一部分。

  • ApiControllers是一次性的,所以你可以在那裏處理你的enumerable。這是可行的,因爲webapi在寫出響應之後總是確保處理它。實際上,控制器實例的註冊就像上面提到的那樣。