默认情况下.net core 默认开启的是异步IO模式. 为了提高系统的处理速度, 会将文件分段发送到客户端.
这是问题的根源.
大文件被分成好几段发送到客户端, 接收方不一定是按照顺序存的.
所以Excel, pdf,word就打不开了.
解决方法是 把
Response.BodyWriter.WriteAsync(buffer)
换成
Response.Body.Write(buffer, 0, buffer.Length);
整体代码如下,
//Response.StartAsync();// Async 当文件超长时Async 会导致excel乱序
//Response.BodyWriter.WriteAsync(buffer);// Async 当文件超长时Async 会导致excel乱序
//Response.BodyWriter.WriteAsync(excelstring);// Async 当文件超长时Async 会导致excel乱序
Response.Body.Write(buffer, 0, buffer.Length);
Response.Body.Flush();
Response.Body.Close();
报错时 记得要在Startup.cs文件中开启同步支持
public void ConfigureServices(IServiceCollection services)
{
// If using Kestrel:
//services.Configure<KestrelServerOptions>(options =>
//{
// options.AllowSynchronousIO = true; // 解决大文件下载乱序的问题
//});
// If using IIS:
services.Configure<IISServerOptions>(options =>
{
options.AllowSynchronousIO = true;// 解决大文件下载乱序的问题
});
}