2010-02-04 131 views
1

我有一个asp.net网页来向用户提供大文件下载。 该页面托管在IIS7,Windows Server 2008上。当内容长度指定(IIS7)时下载大文件太慢

奇怪的是,当我不添加内容长度响应标题时,用户可以以高速下载(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

不要忘记标记答案为接受,如果他们解决您的问题:) – 2010-09-15 09:45:44

回答

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.OutputStream.Write或写一个HttpHandler。

无论如何,我希望能帮助你。

0

Response.AddHeader(“Content-Length”,...)是一个灾难!

我们使用了.NET 4.0,并且经历了很多奇怪的&随机下载损坏。我们缩小了发送给客户端的响应头中内容长度的差异。我们不知道为什么,可能是.NET 4.0的错误?但只要我们注释掉了代码行Response.AddHeader(“Content-Length”,...),所有问题都消失了。

编辑:可能会在内容长度不一致时启用IIS7动态压缩时不可避免的。