ASP.NET Web API ile IAsyncEnumerable'ın nasıl çalıştığına ilişkin açıklama


9

Bir ASP.NET Web API projesinde IAsyncEnumerable keşfederken ilginç bir davranışla karşılaştı. Aşağıdaki kod örneklerini göz önünde bulundurun:

    // 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();
        }
    }

Örnek 1 (int dizisi) {}JSON sonucu olarak döner .

Örnek 2 beklenen sonucu döndürür ["0","1","2","3","4","5","6","7","8","9"]. Ancak, tüm JSON dizisi 10 saniye bekledikten sonra bir kerede döndürülür. Veriler IAsyncEnumerable arabiriminden beklendiği gibi kullanılabilir hale geldiğinde döndürülmemeli midir? Yoksa bu web api tüketilmesi gereken belirli bir yolu var mı?


4
Veriler IAsyncEnumerable arabiriminden beklendiği gibi kullanılabilir hale geldiğinde döndürülmemeli midir? ... ve öyle ... ama json serileştirici için
Selvin

1
(Eğer değiştirirseniz ve 1 Numune .... sigara referans türü için bir böcek gibi görünüyor IAsyncEnumerable<int>için IAsyncEnumerable<object>- bu çalışması gerekir ama sonra katılan bir boks vardır)
Selvin

@Selvin, lütfen biraz açıklar mısınız? Veya bir kod örneği işaret? C # istemcisi ile bu API tüketmeye çalıştım, sonuç aynı, 10 saniye beklemek zorunda ...
Ravi M Patel

10 saniye beklemek zorunda obviosu ... serileştirme sunucu tarafında ve zaman uyumsuz değil ... ne hakkında ayrıntılı?
Selvin

Yanıtlar:


3

Bir web api çağrısı her saniye kısmi json döndürmez. 10x1 saniye (veya ASP .NET'in bir parçası olan json serileştiriciyi çağıran kod) beklemek zorunda olan json serileştiricisidir. Çerçeve kodu ve serileştirici tüm verileri aldıktan sonra, istemciye tek bir yanıt olarak serileştirilir.

In ASP.NET Çekirdek web API Kontrolör eylem dönüş tipleri biz okuyabilir:

ASP.NET Core 3.0 ve sonraki sürümlerinde, bir eylemden IAsyncEnumerable döndürme:

  • Artık senkron yinelemeye neden olmaz.
  • Dönen IEnumerable kadar verimli olur.

ASP.NET Core 3.0 ve sonraki sürümleri, serileştiriciye sağlamadan önce aşağıdaki eylemin sonucunu arabelleğe alır:

public IEnumerable<Product> GetOnSaleProducts() =>
  _context.Products.Where(p => p.IsOnSale);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.