Beim Erkunden von IAsyncEnumerable in einem ASP.NET-Web-API-Projekt ist ein interessantes Verhalten aufgetreten. Betrachten Sie die folgenden Codebeispiele:
// Code Sample 1
[HttpGet]
public async IAsyncEnumerable<int> GetAsync()
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(1000);
yield return i;
}
}
// Code Sample 2
[HttpGet]
public async IAsyncEnumerable<string> GetAsync()
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(1000);
yield return i.ToString();
}
}
Beispiel 1 (int-Array) wird {}
als JSON-Ergebnis zurückgegeben.
Probe 2 gibt das erwartete Ergebnis zurück ["0","1","2","3","4","5","6","7","8","9"]
. Nach 10 Sekunden Wartezeit wird jedoch sofort das gesamte JSON-Array zurückgegeben. Sollte es nicht zurückgegeben werden, wenn Daten wie erwartet von der IAsyncEnumerable-Schnittstelle verfügbar werden? Oder gibt es eine bestimmte Art und Weise, wie diese Web-API verwendet werden sollte?
c#
asp.net-core
asp.net-core-webapi
iasyncenumerable
Ravi M Patel
quelle
quelle
IAsyncEnumerable<int>
umIAsyncEnumerable<object>
- es funktionieren soll , aber dann gibt es eine Box beteiligt)Antworten:
Ein Web-API-Aufruf gibt nicht jede Sekunde einen Teil von json zurück. Es ist der JSON-Serialisierer, der 10 x 1 Sekunde warten muss (oder der Code, der den JSON-Serialisierer aufruft, der Teil von ASP .NET ist). Sobald der Framework-Code und der Serialisierer alle Daten erhalten haben, werden sie serialisiert und als einzelne Antwort an den Client gesendet.
In den Rückgabetypen für Controller-Aktionen in der ASP.NET Core-Web-API können wir Folgendes lesen:
quelle