.net 将缓冲区写入响应流还是在长时间运行的请求结束时写入?
以下是运行.NET Framework的ASP.NET核心API。这是我的一个MVC控制器 我必须从一个外部服务获取数据,让我一次只能获取相当小的数据缓冲区——我无法控制这一点。假设我每个缓冲区有500行数据,但我的客户机希望所有数据同时格式化为CSV,因此我必须循环调用外部源,如下所示:.net 将缓冲区写入响应流还是在长时间运行的请求结束时写入?,.net,asp.net-mvc,asp.net-core,asp.net-core-mvc,.net-core,.net,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,.net Core,以下是运行.NET Framework的ASP.NET核心API。这是我的一个MVC控制器 我必须从一个外部服务获取数据,让我一次只能获取相当小的数据缓冲区——我无法控制这一点。假设我每个缓冲区有500行数据,但我的客户机希望所有数据同时格式化为CSV,因此我必须循环调用外部源,如下所示: [HttpGet] public async Task<IActionResult> Get(MyRequest request) { var aggregateResponse = aw
[HttpGet]
public async Task<IActionResult> Get(MyRequest request)
{
var aggregateResponse = await client.GetDataAsync(request);
while (aggregateResponse.HasMoreData)
{
request.Cookie = aggregateResponse.Cookie;
var response = await client.GetDataAsync(request);
//Data is a list of objects containing n number of properties
aggregateResponse.Data.Concat(response.Data)
//I need the cookie from the previous response to get the next buffer
aggregateResponse.Cookie = response.Cookie;
aggregateResponse.HasMoreData = response.HasMoreData;
}
//runs through a generic IEnumerable CSV output formatter (uses reflection)
return Ok(aggregateResponse.Data);
}
不幸的是,这可能需要100-200个循环才能取回aggregateResponse.data中50000-100000个列表项的所有数据,但我在这方面没有太多选择
将每个数据缓冲区格式化为循环中的CSV并每次将其写入响应流会更有效吗,还是像我目前所做的那样等到结束会更好?例如:
[HttpGet]
public async Task<IActionResult> Get(MyRequest request)
{
var response = await client.GetDataAsync(request);
await Response.WriteAsync(formatBeginningData(response.Data))
while (request.HasMoreData)
{
request.Cookie = aggregateResponse.Cookie;
response = await client.GetDataAsync(request);
await Response.WriteAsync(formatData(response.Data))
request.Cookie = response.Cookie;
request.HasMoreData = response.HasMoreData;
}
return Ok();
}
在这个方法中,我一直在使用async进行数据调用,但这意味着线程要切换很多次。异步执行此操作是否真的会降低性能?所有这些都应该是同步方法签名和数据调用吗
将每个数据缓冲区格式化为循环中的CSV并每次将其写入响应流会更有效吗,还是像我目前所做的那样等到结束会更好
您可以流式处理,但我不推荐它,除非数据太大,无法放入内存
流式传输的优点是,数据不必放入内存,客户端可以逐段接收数据
流式传输的缺点是,必须在流式传输开始之前发送HTTP响应代码,因此在流式传输开始后无法通知客户端错误。因此,如果其中一个对GetDataAsync的调用失败,客户机仍然会得到一个200 OK,但其数据会意外地被切断
在这个方法中,我一直在使用async进行数据调用,但这意味着线程要切换很多次。异步执行此操作是否真的会降低性能?所有这些都应该是同步方法签名和数据调用吗
没有;ASP.NET核心上的异步代码与同步代码具有相同或更少的线程开关