我有一个asp.net网页,可以向用户提供大量文件下载。 该页面托管在IIS7,Windows Server 2008上。
奇怪的是,当我不添加内容长度响应标头时,用户可以以良好的速度(2MB / s)下载,但是一旦我添加此标头,下载速度就会下降到35kbps / s左右。
这是代码:
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/octet-stream";
//speed drops when I add this line:
//Response.AddHeader("Content-Length", new FileInfo(filepath).ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
Response.TransmitFile(filepath);
Response.Flush();
当然我可以保留内容长度,但用户不会知道文件有多大以及下载需要多长时间......这很烦人。
知道什么会导致下载速度发生这么大的变化吗?
提前感谢任何见解!
答案 0 :(得分:1)
我最近使用了以下代码......
Response.AddHeader("Content-disposition", "attachment; filename=" + attachment.Filename);
Response.AddHeader("Content-length", attachment.Filedata.Length.ToString());
Response.ContentType = attachment.ContentType;
Response.OutputStream.Write(attachment.Filedata.ToArray(), 0, attachment.Filedata.Length);
Response.End();
(在这种情况下,我的附件实际存储在数据库表中,但它只是将一个字节数组写入输出流)
而不是你的方法......
Response.TransmitFile(filepath);
传输速度似乎相当不错。我在几秒钟内从实时网站上下载了3.5MB。 (不只是在当地!)
我知道我应该使用HttpHandler而不是劫持Response,但现在这样做。此外,我应该读取块中的字节数组,以避免占用太多内存。我会在某个时候回去再做一点修改。
因此,您可以尝试使用Response.OutputStream.Write
或编写HttpHandler。
无论如何,我希望能帮到你。
答案 1 :(得分:0)
Response.AddHeader(“Content-Length”,...)是一场灾难!
我们使用的是.NET 4.0,经历了很多奇怪的事情。随机下载损坏。我们缩小到发送给客户端的响应标头中的内容长度的差异。我们不知道为什么,可能是.NET 4.0的bug?但是,只要我们注释掉代码行Response.AddHeader(“Content-Length”,......),所有问题都会消失。
编辑:启用IIS7动态压缩时,内容长度可能不一定是不可避免的。