這個答案實際上是您對Ladislav Mrnka最後評論的答案。你說:
好吧,我明白了,所以沒有「免費的甜甜圈」可能。在LINQ to Any中,我們有這樣的行爲,但有必要跨越服務邊界,即數據被(序列化),打破它,對吧?
雖然它不是免費的,但它仍然是可能的!
在服務器端,你必須提供一個初始化請求的方法和一個方法來逐個獲取結果。
在客戶端 - 特別是在其低級別的基礎設施類中 - 您可以將其包裝在枚舉器中,最後,您的「業務」類可以像使用其他枚舉器一樣使用該枚舉器。
我們已經討論過,它會在每個項目所需的請求 - 響應方式中引入額外開銷。這會引入延遲並增加網絡負載。
使用僞的RESTful API可能看起來像這樣這種方法的一個樣本:
服務器端:
POST http://server/api/search-specification
:
主體包含需要爲您的搜索,例如參數開始日期和結束日期
響應將是標識搜索規範的URI。
GET http://server/api/search-specification/1/next-result
:
迴應將是下一個項目。
這個控制器看起來是這樣的:
public Response PostSearchSpecification(SearchSpecification spec)
{
int id = _searches.Max(x => x.Key) + 1; // Make thread-safe
_searches[id] = _provider.GetSome().GetEnumerator();
return ...;
}
public Item GetNextResult(int searchSpecId)
{
if(_searches[searchSpecId].MoveNext())
return _searches.Current;
else
return null; // or return a HTTP status code that tells the
// client that there are no more items.
}
我稱它是假的RESTful API,因爲它肯定看起來像一個,但它需要在內部保持狀態,每種規格啓用延期執行。另外GET http://server/api/search-specification/1/next-result
不是冪等的。
但我認爲這證明了我的意思:)
的客戶端會以某種方式封裝它是這樣的:
class Search
{
public IEnumerable<Item> Start(params)
{
var client = new HttpClient(...);
var resultsUri = client.Post(new SearchSpecification(params)).Response;
Item item = client.Get<Item>(resultsUri);
while(item != null)
{
yield return item;
item = client.Get<Item>(resultsUri);
}
}
}
而且你會使用這樣的:
var search = new Search();
foreach(var item in search.Start(...))
// ...
只是一個關於如何實現這樣的東西的原始素描。
你預計會發生什麼?客戶是否要求每件物品?因爲這是通過電線推遲執行所需要的。 –
@DanielHilgarth:是的,我想知道是否有可能在實現時要求每個項目輪流輪流。下面是一個例子:我有一些重要的EF調用,WCF客戶端必須等待它完成,而不是序列化整個結果集,反序列化它,並且只能開始迭代。而不是開始處理之前的第一個結果將從數據庫讀取/從服務接收。 – abatishchev
這是關於流媒體 - 而不是延期執行...即使使用WCF流媒體,它可能無法正常工作。您將不得不進行非常低級別的HTTP(分塊編碼)或TCP編程來實現這一點。 –