¿Cuál es la firma correcta para una acción de controlador que devuelve un IAsyncEnumerable<T>
y a NotFoundResult
pero 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 foreach
bucle 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;
}
}
IAsyncEnumerable
Está 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
IAsyncEnumerable
conocimiento de 3.0.
MyObject
artículos con lo mismoid
? Normalmente, no enviaría unNotFound
por algo que devuelve unIEnumerable
, simplemente estaría vacío, o devolvería el artículo individual con elid
/ solicitadoNotFound
.