Как отправить 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 и.

Другие вопросы по тегам