ASP.NET Core 現在支持從控制器操作一直到回應 JSON 格式化程式的異步流。IAsyncEnumerable在回應內容被發送之前,從一個動作中回傳一個不再緩沖記憶體中的回應內容。這有助于在回傳可以異步列舉的大型資料集時減少記憶體使用。
由于DbSetimplements IAsyncEnumerable,完全支持以下示例:
[ApiController]
public class Controller : ControllerBase
{
private readonly DbContext _context;
public Controller(DbContext context) => _context = context;
[HttpGet]
public IAsyncEnumerable<AspNetUser> GetData()
{
return _context.AspNetUsers.AsAsyncEnumerable();
}
}
看似只有在回傳資料源本身時才能使用此功能,但是當資料源被包裝時,因此可以發送額外的元資料,流式傳輸是不可能的。
基本API結果:
public class DataSourceResult<T>
{
public IEnumerable<T> Data { get; set; }
public int PageIndex { get; set; }
public int PageSize { get; set; }
public int TotalCount { get; set; }
}
由于我的許多應用程式都在低記憶體環境中運行,我正在尋找如何在間接回傳資料的情況下利用異步流的想法。
uj5u.com熱心網友回復:
所有你需要做的是改變你的DataSourceResult<T>類有一個Data的屬性型別IAsyncEnumerable<T>。該System.Text.Json串行器識別的型別和它流到客戶端。所以:
public class DataSourceResult<T>
{
public IAsyncEnumerable<T> Data { get; set; }
public int PageIndex { get; set; }
public int PageSize { get; set; }
public int TotalCount { get; set; }
}
你的行動將是這樣的:
public DataSourceResult<AspNetUser> GetData()
{
return new DataSourceResult<AspNetUser>
{
Data = _context.AspNetUsers.AsAsyncEnumerable(),
PageIndex = 1,
PageSize = 10,
TotalCount = 12345
};
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/356611.html
