Какова правильная подпись для действия контроллера, которое возвращает IAsyncEnumerable<T>
и, NotFoundResult
но все еще обрабатывается асинхронно?
Я использовал эту подпись, и она не компилируется, потому что IAsyncEnumerable<T>
не является ожидаемой:
[HttpGet]
public async Task<IActionResult> GetAll(Guid id)
{
try
{
return Ok(await repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable
}
catch (NotFoundException e)
{
return NotFound(e.Message);
}
}
Этот компилируется нормально, но его подпись не асинхронная. Так что я волнуюсь, заблокирует ли он потоки пула потоков или нет:
[HttpGet]
public IActionResult GetAll(Guid id)
{
try
{
return Ok(repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable
}
catch (NotFoundException e)
{
return NotFound(e.Message);
}
}
Я попытался использовать await foreach
цикл таким образом, но он, очевидно, тоже не скомпилируется:
[HttpGet]
public async IAsyncEnumerable<MyObject> GetAll(Guid id)
{
IAsyncEnumerable<MyObject> objects;
try
{
objects = contentDeliveryManagementService.GetAll(id); // GetAll() returns an IAsyncEnumerable
}
catch (DeviceNotFoundException e)
{
return NotFound(e.Message);
}
await foreach (var obj in objects)
{
yield return obj;
}
}
IAsyncEnumerable
ожидаемо. Использование await foreach(var item from ThatMethodAsync()){...}
.
IAsyncEnumerable<MyObject>
, просто верните результат, например return objects
. Это не преобразует действие HTTP в потоковый gRPC или метод SignalR. Промежуточное программное обеспечение будет по-прежнему потреблять данные и отправлять клиенту один HTTP-ответ
IAsyncEnumerable
поддерживает версии 3.0.
MyObject
предметов с одинаковымиid
? Обычно вы не отправляетеNotFound
что-то, что возвращаетIEnumerable
- оно будет пустым - или вы возвращаете один элемент с запрошеннымid
/NotFound
.