¿Cuál es la firma correcta para una acción de controlador que devuelve un IAsyncEnumerable<T>y a NotFoundResultpero que aún se procesa de forma asíncrona?
IAsyncEnumerable<T>Usé esta firma y no se compila porque no está a la espera:
[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);
}
}
Este se compila bien pero su firma no es asíncrona. Entonces me preocupa si bloqueará los hilos del grupo de hilos o no:
[HttpGet]
public IActionResult GetAll(Guid id)
{
try
{
return Ok(repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable
}
catch (NotFoundException e)
{
return NotFound(e.Message);
}
}
Intenté usar un await foreachbucle como este, pero eso obviamente tampoco compilaría:
[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;
}
}
IAsyncEnumerableEstá a la espera. Uso await foreach(var item from ThatMethodAsync()){...}.
IAsyncEnumerable<MyObject>, simplemente devuelva el resultado, por ejemplo return objects. Sin embargo, eso no convertirá una acción HTTP en un método gRPC o SignalR de transmisión. El middleware seguirá consumiendo los datos y enviará una única respuesta HTTP al cliente
IAsyncEnumerableconocimiento de 3.0.
MyObjectartículos con lo mismoid? Normalmente, no enviaría unNotFoundpor algo que devuelve unIEnumerable, simplemente estaría vacío, o devolvería el artículo individual con elid/ solicitadoNotFound.