Erläuterungen zur Funktionsweise von IAsyncEnumerable mit der ASP.NET-Web-API


9

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?


4
Sollte es nicht zurückgegeben werden, wenn Daten wie erwartet von der IAsyncEnumerable-Schnittstelle verfügbar werden? ... und es tut ... aber für json serializer
Selvin

1
und Probe 1 .... scheint wie ein Fehler für nicht Referenzart (wenn Sie ändern , IAsyncEnumerable<int>um IAsyncEnumerable<object>- es funktionieren soll , aber dann gibt es eine Box beteiligt)
Selvin

@ Selvin, würden Sie bitte näher darauf eingehen? Oder auf ein Codebeispiel zeigen? Ich habe versucht, diese API mit C # -Client zu verwenden, das Ergebnis ist das gleiche, muss 10 Sekunden warten ...
Ravi M Patel

Ich muss 10 Sekunden warten, es ist offensichtlich ... die Serialisierung ist auf der Serverseite und nicht asynchron ... über was?
Selvin

1
Der Fehler ist hier ... offensichtlich deshalb
Selvin

Antworten:


3

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:

In ASP.NET Core 3.0 und höher wird IAsyncEnumerable von einer Aktion zurückgegeben:

  • Führt nicht mehr zu einer synchronen Iteration.
  • Wird so effizient wie die Rückgabe von IEnumerable.

ASP.NET Core 3.0 und höher puffert das Ergebnis der folgenden Aktion, bevor es dem Serializer bereitgestellt wird:

public IEnumerable<Product> GetOnSaleProducts() =>
  _context.Products.Where(p => p.IsOnSale);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.