gpt4 book ai didi

c# - MVC 5 WebAPI - 下载文件 - HttpException

转载 作者:太空狗 更新时间:2023-10-29 21:56:55 25 4
gpt4 key购买 nike

我创建了一个 WebAPI Controller - 基于 MVC 5 - 为我们的客户提供不同的文件。访问文件的工具也是自己编写的 - 基于 .NET HttpClient - 但那是另一回事了。

在下载 Controller 的第一个版本中,我使用内置机制来提供类似 this 的文件。

但是对于大于 4GB 的文件,该机制在我的 iis 上崩溃了。

所以我终于得出了这段代码:

    public class DownloadController : ApiController
{
public async Task Get(long id)
{
string fullFilePath = GetFilePathById(id);
string returnFileName = fullFilePath.Split('\\').Last();
FileInfo path = new FileInfo(fullFilePath);
HttpContext.Current.Response.ContentType = "application/zip";
HttpContext.Current.Response.AddHeader("Content-Length", path.Length.ToString());
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + returnFileName);
HttpContext.Current.Response.Flush();
try
{
byte[] buffer = new byte[4096];
using (FileStream fs = path.OpenRead())
{
using (BufferedStream bs = new BufferedStream(fs, 524288))
{
int count = 0;
while ((count = bs.Read(buffer, 0, buffer.Length)) > 0)
{
if (!HttpContext.Current.Response.IsClientConnected)
{
break;
}
HttpContext.Current.Response.OutputStream.Write(buffer, 0, count);
HttpContext.Current.Response.Flush();
}
}
}
}
catch (Exception exception)
{
//Exception logging here
}
}
}

该代码运行良好,我在可接受的 CPU 使用率和磁盘 i/o 下获得了快速下载。但过了一段时间后,我注意到 - 每一次下载 - 一个未处理的异常都会像这样在 IIS 服务器的应用程序事件日志中写入一个条目:

Server cannot set status after HTTP headers have been sent

Exception type: HttpException

Event Log ID 1309

我确信重复使用 .Flush() 会导致问题,但如果我删除其中任何一个,下载就会停止。

在类似的问题中,我可以找到 Response.BufferOutput = true; 作为解决方案,但这似乎占用了我所有的服务器资源并延迟了下载。

任何建议都会很棒!

最佳答案

问题不在于 Flush(),而是您没有使用 HttpContext.Current.Response.Close(); 自行关闭响应流。

ASP.NET 框架不知道您在操作方法中做什么,因此它通过通常的请求管道传递请求,该管道代替我们执行所有必要的管道。其中之一是它将 header 和 HTTP 状态发送到客户端。但是,当框架尝试这样做时,您已经设置并发送了 header 。为避免这种情况,您应该关闭流,并通过关闭响应流自行完成处理。

关于c# - MVC 5 WebAPI - 下载文件 - HttpException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35341830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com