Как отправить IAsyncEnumerator из WebAPI и передавать данные через HttpClient в C# 8+?
Существуют примеры чтения данных из IAsyncEnumerator в пользовательский интерфейс в приложении Blazor с использованием внутренней службы. Также существуют примеры того, как отправить IAsyncEnumerator как результат действия контроллера веб-API.
Я еще не видел примеров того, как читать поток IAsyncEnumerator из API, используя HttpClient внутри клиента, такого как Blazor или Xamarin. Все, что я пробовал до сих пор, возвращает HttpResponseMessage на клиенте только после выполнения цикла async / await foreach в API.
HttpResponseMessage response = await _httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);
Каким должен быть тип контента (атрибут Produces) для действия HttpGet? Какое должно быть значение Accept в заголовке запроса от HttpClient?
[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;
}
}
1 ответ
Лучше не делать этого с необработанной моделью запроса-ответа http 1.1, которая не предназначена для этого, а объекты потоковой передачи отличаются от загрузки файлов. С помощью websocket или http2.0, которые поддерживают мультиплексирование, вы можете сериализовать каждый элемент, созданныйIAsyncEnumerable
и десериализуйте их в клиенте. Но все же это ручное управление и не стоит. Вы можете использовать gRPC, который официально поддерживается ASP.NET Core и поддерживает потоковую передачу объектов. Он также поддерживает намного больше языков и имеет строго типизированное определение интерфейса по сравнению с SignalR, который поддерживает только JavaScript/.NET/Java и.