2010-02-04 103 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動態壓縮時不可避免的。