Spotkałem interesujące zachowanie podczas eksploracji IAsyncEnumerable w projekcie ASP.NET Web API. Rozważ następujące przykłady kodu:
// 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();
}
}
Próbka 1 (tablica int) zwraca {}
jako wynik JSON.
Próbka 2 zwraca oczekiwany wynik ["0","1","2","3","4","5","6","7","8","9"]
. Jednak cała tablica JSON jest zwracana jednocześnie po 10 sekundach oczekiwania. Czy nie należy zwrócić, ponieważ dane stają się dostępne zgodnie z oczekiwaniami z interfejsu IAsyncEnumerable? Czy jest jakiś konkretny sposób, w jaki należy korzystać z tego interfejsu API?
c#
asp.net-core
asp.net-core-webapi
iasyncenumerable
Ravi M. Patel
źródło
źródło
IAsyncEnumerable<int>
naIAsyncEnumerable<object>
- powinno działać, ale wtedy występuje boks)Odpowiedzi:
Wywołanie interfejsu API sieci Web nie zwróci częściowego JSON co sekundę. To serializator json musi czekać 10x1 sekund (lub kod wywołujący serializator json, który jest częścią ASP .NET). Gdy kod frameworku i serializator otrzymają wszystkie dane, zostaną one zserializowane dostarczone - jako pojedyncza odpowiedź - do klienta.
W typach akcji kontrolera zwracanych w interfejsie API sieci Web platformy ASP.NET Core możemy przeczytać:
źródło