Làm rõ về cách IAsyncEnumerable hoạt động với ASP.NET Web API


9

Tôi đã gặp một hành vi thú vị khi khám phá IAsyncEnumerable trong một dự án API Web ASP.NET. Hãy xem xét các mẫu mã sau:

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

Mẫu 1 (mảng int) trả về {}dưới dạng kết quả JSON.

Mẫu 2 trả về kết quả mong đợi ["0","1","2","3","4","5","6","7","8","9"]. Tuy nhiên, toàn bộ mảng JSON được trả về cùng một lúc sau 10 giây chờ đợi. Không nên trả lại khi dữ liệu có sẵn như mong đợi từ giao diện IAsyncEnumerable? Hoặc có bất kỳ cách cụ thể mà api web này nên được tiêu thụ?


4
Không nên trả lại khi dữ liệu có sẵn như mong đợi từ giao diện IAsyncEnumerable? ... và nó ... nhưng đối với serial serial json
Selvin

1
và Mẫu 1 .... có vẻ như là một lỗi cho loại không tham chiếu (nếu bạn đổi IAsyncEnumerable<int>thành IAsyncEnumerable<object>- nó sẽ hoạt động nhưng sau đó có một quyền anh liên quan)
Selvin

@Selvin, bạn vui lòng giải thích? Hoặc chỉ vào một mẫu mã? Tôi đã cố gắng sử dụng API này với ứng dụng khách C #, kết quả là như nhau, phải chờ trong 10 giây ...
Ravi M Patel

phải đợi trong 10 giây , obviosu ... serialization nằm ở phía máy chủ và nó không đồng bộ ... giải thích về cái gì?
Selvin

Câu trả lời:


3

Một cuộc gọi api web sẽ không trả lại một phần json mỗi giây. Đó là serialiser json, người phải đợi 10 giây (hoặc mã gọi là serial serial json, là một phần của ASP .NET). Khi mã khung và trình tuần tự hóa nhận được tất cả dữ liệu, nó sẽ được tuần tự hóa được phục vụ - dưới dạng một phản hồi duy nhất - cho máy khách.

Trong các kiểu trả về hành động của Trình điều khiển trong API web ASP.NET Core, chúng ta có thể đọc:

Trong ASP.NET Core 3.0 trở lên, trả về IAsyncEnumerable từ một hành động:

  • Không còn kết quả trong việc lặp lại đồng bộ.
  • Trở nên hiệu quả như trả lại IEnumerable.

ASP.NET Core 3.0 và sau đó đệm kết quả của hành động sau trước khi cung cấp cho bộ nối tiếp:

public IEnumerable<Product> GetOnSaleProducts() =>
  _context.Products.Where(p => p.IsOnSale);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.