Quelle est la bonne signature pour une action de contrôleur qui renvoie un IAsyncEnumerable<T>
et un NotFoundResult
mais qui est toujours traitée de manière asynchrone?
J'ai utilisé cette signature et elle ne se compile pas car elle IAsyncEnumerable<T>
n'est pas attendue:
[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);
}
}
Celui-ci compile bien mais sa signature n'est pas asynchrone. Je me demande donc si cela bloquera ou non les threads du pool de threads:
[HttpGet]
public IActionResult GetAll(Guid id)
{
try
{
return Ok(repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable
}
catch (NotFoundException e)
{
return NotFound(e.Message);
}
}
J'ai essayé d'utiliser une await foreach
boucle comme celle-ci, mais cela ne se compilerait évidemment pas non plus:
[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 attendue. Utilisez await foreach(var item from ThatMethodAsync()){...}
.
IAsyncEnumerable<MyObject>
, renvoyez simplement le résultat, par exemple return objects
. Ce ne sera pas convertir une action HTTP à une méthode GRPC ou SignalR le streaming bien. Le middleware consommera toujours les données et enverra une seule réponse HTTP au client
IAsyncEnumerable
consciente à partir de 3.0.
MyObject
articles avec le mêmeid
? Normalement, vous n'enverriez pas unNotFound
pour quelque chose qui renvoie unIEnumerable
- il serait simplement vide - ou vous renverriez le seul élément avec leid
/ demandéNotFound
.