Was ist die richtige Signatur für eine Controller-Aktion, die ein IAsyncEnumerable<T>
und ein zurückgibt, NotFoundResult
aber dennoch asynchron verarbeitet wird?
Ich habe diese Signatur verwendet und sie wird nicht kompiliert, weil sie IAsyncEnumerable<T>
nicht erwartet werden kann:
[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);
}
}
Dieser kompiliert gut, aber seine Signatur ist nicht asynchron. Ich mache mir also Sorgen, ob Thread-Pool-Threads blockiert werden oder nicht:
[HttpGet]
public IActionResult GetAll(Guid id)
{
try
{
return Ok(repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable
}
catch (NotFoundException e)
{
return NotFound(e.Message);
}
}
Ich habe versucht, eine await foreach
Schleife wie diese zu verwenden, aber das würde natürlich auch nicht kompiliert:
[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
ist zu erwarten. Verwenden Sie await foreach(var item from ThatMethodAsync()){...}
.
IAsyncEnumerable<MyObject>
einfach das Ergebnis zurück, z return objects
. Dass nicht eine HTTP - Aktion zu einer Streaming - gRPC oder SignalR Methode obwohl konvertieren. Die Middleware verbraucht weiterhin die Daten und sendet eine einzelne HTTP-Antwort an den Client
IAsyncEnumerable
ab 3.0 bekannt.
MyObject
Artikel mit demselben zurückid
? Normalerweise würden Sie keineNotFound
für etwas senden, das eine zurückgibtIEnumerable
- es wäre nur leer - oder Sie würden den einzelnen Artikel mit dem angefordertenid
/ zurückgebenNotFound
.