2010-01-21 46 views
8

我有服務器使用WriteFile的你下載過該文件的一個5MB的PDF給我下載15兆字節,其中作爲的TransmitFile給出正確的文件大小爲5Mb ...C#Response.WriteFile VS Response.TransmitFile文件大小問題

是這是由於某種解壓縮到服務器上的writeFile內存?只是不知道是否有人看到發生同樣的事情...

(PS只注意到它,因爲我們去IIS7?)

代碼是...

if (File.Exists(filepath)) 
{ 
    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.ContentType = "application/octet-stream"; 
    HttpContext.Current.Response.AddHeader("content-disposition","attachment;filename=\""+Path.GetFileName(filepath)+"\""); 
    HttpContext.Current.Response.AddHeader("content-length", new FileInfo(filepath).Length.ToString()); 

    //HttpContext.Current.Response.WriteFile(filepath); 
    HttpContext.Current.Response.TransmitFile(filepath); 

    HttpContext.Current.Response.Flush(); 
    HttpContext.Current.Response.Close(); 
} 
+0

我剛剛有同樣的錯誤。 IIS上的壓縮設置不會影響它。 – geofftnz 2011-11-03 01:06:31

回答

7

的TransmitFile - 寫指定的文件直接傳輸到HTTP響應輸出流而不緩存在內存中。

WriteFile - 將指定的文件直接寫入HTTP響應輸出流。

我會說差異的發生是因爲傳輸文件不會緩衝它。寫文件正在使用緩衝(Afiak),基本上在傳輸數據之前臨時保存數據,因爲它無法猜測準確的文件大小,因爲它將數據寫入塊中。

2

你可以通過下面的定義來理解。

Response.TransmitFile VS Response.WriteFile:

  • 的TransmitFile:這種方法將文件發送到客戶端,沒有它裝載到服務器上的應用程序存儲器。如果下載的文件大小很大,這是使用它的理想方式。

  • WriteFile:此方法在將文件發送到客戶端之前將正在下載的文件加載到服務器的內存中。如果文件較大,可能會ASPNET工作進程可能會重新啓動*

參考: - 。TransmitFile VS WriteFile