簡體   English   中英

如何通過 C# 8+ 中的 HttpClient 從 WebAPI 和 stream 數據發送 IAsyncEnumerator?

[英]How to send IAsyncEnumerator from WebAPI and stream data through HttpClient in C# 8+?

存在使用內部服務將數據從IAsyncEnumerator讀取到 Blazor 應用程序中的 UI 的示例。 還存在有關如何將IAsyncEnumerator作為 output 從 Web API Z9BBF256C803792687CFE27 發送的示例

I haven't seen any examples yet how to read an IAsyncEnumerator stream from an API using an HttpClient within a client like Blazor or Xamarin. 到目前為止,我所做的一切都只在 API 上的 async/await foreach 循環完成后返回客戶端上的 HttpResponseMessage。

HttpResponseMessage response = await _httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);

HttpGet 操作的內容類型應該是什么(Produces 屬性)? 來自 HttpClient 的請求 header 的 Accept 值應該是多少?

[HttpGet]
[Produces("application/json")]
public async IAsyncEnumerable<Data> Get(CancellationToken cancellationToken)
{
    var dbSet = _dbContext.TableName.AsNoTracking().AsAsyncEnumerable().WithCancellation(cancellationToken).ConfigureAwait(false);
    await foreach (var i in dbSet.ConfigureAwait(false))
    {
        var item = new Data
        {
            Id = i.Id,
            Name = i.Name
        };
        yield return item;
    }
}

您最好不要使用原始的 http 1.1 請求-響應 model,它不是為此而設計的,並且流對象與下載文件不同。 使用支持多路復用的 websocket 或 http2.0,您可以對IAsyncEnumerable產生的每個元素進行序列化,並在客戶端對其進行反序列化。 但這仍然是手動控制的,不值得。 您可以使用由 ASP.NET 核心正式支持並支持 object 流的 gRPC。 與僅支持 JavaScript/.NET/Java 的 SignalR 相比,它還支持更多語言並具有強類型接口定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM