2009-12-08 48 views
4

我正在開發一個ASP.NET應用程序,它使用Response.TransmitFile在某一時刻向用戶發送一個文件。Response.TransmitFile,Response.End和IE問題

它可以在我的開發機器上正常工作,當我將它部署到測試服務器時,它仍然可以在其中兩個上工作;在其中一臺服務器上(W2K3),它只能在Firefox上運行,當我在IE7上嘗試時,出現「Internet Explorer無法打開(服務器名稱)上的文件sendfile.aspx」的錯誤。

我創建了一個小型內嵌aspx頁面來攝製的問題,那就是:

<%@ Page Language="C#" %> 
<html><head> 
<script language="CS" runat="server"> 
    void Page_Load(object sender, System.EventArgs e) 
    { 
     string filePath = @"C:\temp\export.zip"; 
     Response.ClearHeaders(); 
     Response.ContentType = "application/zip"; 
     Response.Clear(); 
     Response.AppendHeader("Content-disposition", "attachment; filename=export.zip"); 
     Response.TransmitFile(filePath); 
     Response.End(); 
    } 
</script> 
</head></html> 

我已經嘗試不同的事情,我發現,如果我註釋掉Response.End線再次工作(但AFAIK這條線應該在那裏,至少根據我在網上找到的每個示例代碼)

我注意到的另一個問題可能與也可能不相關的是,它也將失敗,如果我刪除<html>, <head>及其關閉標籤。

我一直在撓我的頭這一段時間了,有沒有人有線索如何讓這個工作?

+0

可以請你發佈你已經提及的樣品鏈接。 – Saar

回答

0

由於我不能(還)添加評論,這裏有一個小記錄。

請注意Response.End()因爲該方法終止線程並且在該點之後什麼都不會執行。 您可能想要做一個Response.Flush()TransmitFile()以確保所有內容都發送到客戶端。有關關於Response.End()的更多信息,請參閱this question

1

請勿使用Response.End();

嘗試

Response.TransmitFile(filePath); 
Response.End(); 
其實

,.NET 2.0之後,你應該使用

Response.TransmitFile(filePath); 
context.HttpApplication.CompleteRequest(); 
+1

太糟糕了,不允許您發送二進制流。 – Nuzzolilo

0

顯然有點晚要到OP是有用的,但顯然ZIP文件有一些問題MIME類型和IIS壓縮。見維基上SharpLibZip:

https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples#wiki-anchorMemory

Response.ContentType = 「應用程序/壓縮」 '如果瀏覽器接收一錯位壓縮文件,IIS壓縮可能導致此問題。一些成員已發現 'Response.ContentType =‘應用/八位字節流’已經解決了這個。可能特定於Internet Explorer。

這也許就是爲什麼你需要使用的二進制/八位字節。