2

存在使用内部服务将数据从 IAsyncEnumerator 读取到 Blazor 应用中的 UI 的示例 还存在有关如何将IAsyncEnumerator作为 Web API 控制器操作的输出发送的示例。

我还没有看到任何示例,如何在 Blazor 或 Xamarin 等客户端中使用 HttpClient 从 API 读取 IAsyncEnumerator 流。到目前为止,我所做的一切都是在 API 上的 async/await foreach 循环完成后才返回客户端上的 HttpResponseMessage 。

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

HttpGet 操作的内容类型应该是什么(Produces 属性)?来自 HttpClient 的请求标头上的 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;
    }
}
4

1 回答 1

2

您最好不要使用原始 http 1.1 请求-响应模型,该模型不是为此而设计的,并且流对象与下载文件不同。使用支持多路复用的 websocket 或 http2.0,您可以序列化由 产生的每个元素,IAsyncEnumerable并在客户端对其进行反序列化。但这仍然是手动控制的,不值得。您可以使用 ASP.NET Core 正式支持并支持对象流的 gRPC。与仅支持 JavaScript/.NET/Java 和 .

于 2020-04-03T05:06:20.277 回答