Я столкнулся с интересным поведением при изучении IAsyncEnumerable в проекте ASP.NET Web API. Рассмотрим следующие примеры кода:
// Code Sample 1
[HttpGet]
public async IAsyncEnumerable<int> GetAsync()
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(1000);
yield return i;
}
}
// Code Sample 2
[HttpGet]
public async IAsyncEnumerable<string> GetAsync()
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(1000);
yield return i.ToString();
}
}
Образец 1 (массив int) возвращается {}
как результат JSON.
Образец 2 возвращает ожидаемый результат ["0","1","2","3","4","5","6","7","8","9"]
. Однако весь массив JSON возвращается сразу после 10 секунд ожидания. Разве это не должно быть возвращено, поскольку данные становятся доступными, как и ожидалось от интерфейса IAsyncEnumerable? Или есть какой-то конкретный способ использования этого веб-API?
c#
asp.net-core
asp.net-core-webapi
iasyncenumerable
Рави М Патель
источник
источник
IAsyncEnumerable<int>
наIAsyncEnumerable<object>
- это должно работать, но тогда будет задействован бокс)Ответы:
Вызов веб-API не будет возвращать частичный JSON каждую секунду. Сериализатору json приходится ждать 10x1секунду (или код, вызывающий сериализатор json, который является частью ASP .NET). После того как код инфраструктуры и сериализатор получат все данные, они будут сериализованы и переданы клиенту в виде одного ответа.
В возвращаемых типах действий контроллера в веб-API ASP.NET Core мы можем прочитать:
источник