2010-11-09 37 views
2

我最近開發了一個列出一系列報告的Web用戶控件。當用戶點擊報告它使用下面的代碼提供早在響應流中的CSV文件下載:爲什麼IE無法從Response.Write服務我的CSV文件?

Response.Clear(); 

Response.ContentType = "text/CSV"; 

Response.CacheControl = "no-cache"; 
Response.AddHeader("Pragma", "no-cache"); 
Response.Expires = -1; 

Response.AddHeader("Pragma", "must-revalidate"); 
Response.AddHeader("Cache-Control", "must-revalidate"); 
Response.AddHeader("Accept-Header", csvResults.Length.ToString()); 
Response.AddHeader("Content-Length", csvResults.Length.ToString()); 
Response.AddHeader("content-disposition", "attachment; filename=test.csv"); 
Response.Write(csvResults.ToString()); 
Response.Flush(); 
Response.End(); 

的代碼最初是在所有的瀏覽器工作正常。然後客戶要求爲該網站使用SSL。作爲其中的一部分,我介紹一個全球性的處理程序從HTTP協議升級到HTTPS所有請求如下:

protected void Application_BeginRequest(Object sender, EventArgs e) 
    { 
     string requestURL = Request.Url.ToString().ToLower(); 
     if (requestURL.StartsWith("http://")) 
     { 
      Response.Redirect(requestURL.Replace("http:", "https:")); 
     } 
    } 

然而,由於使用SSL的CSV文件下載不再是IE瀏覽器雖然他們固定的網站繼續爲Firefox/Chrome/Safari工作。

爲了使文件響應正常工作,在IE中唯一的頭文件中是否存在缺少的內容?

我從IE收到的消息是:

「Internet Explorer無法從下載 Reports.aspx ....在......

的Internet Explorer無法打開 這個互聯網網站。請求的網站 要麼不可用,要麼找不到 ,請稍後再試。「

UPDATE:

下面是一些例子提琴手輸出的頁面請求,它看起來像它的服務正確回來。爲什麼IE不明白它只是提供了一個文件?

HTTP/1.1 200 OK 
Date: Tue, 09 Nov 2010 14:23:50 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 4.0.30319 
Pragma: no-cache 
Pragma: must-revalidate 

content-disposition: attachment; filename="test.csv" 
Cache-Control: no-cache 
Pragma: no-cache 
Expires: -1 
Content-Length: <length value would be here> 
Content-Type: text/CSV 

"COL1","COL2","COL3" 
"VAL1","VAL2","VAL3" 
"VAL1","VAL2","VAL3" 
"VAL1","VAL2","VAL3" 

回答

7

花了幾個小時試圖解決這個問題後,我終於想出了一個解決方案。

幸運的是,我設法遇到了關於IE在HTTPS和包含緩存指令的響應頭之間不兼容的a post by Eric Law

現在確認已清除所有響應標頭,並且未對響應執行緩存指令,然後該文件再次以下載方式開始響應。

0

不知道這是否會解決您的問題,但我會仔細檢查CSV文件的請求以https開始做,以避免通過的Application_BeginRequest重定向去。

您可以使用Fiddler查看所有正在發出的請求,這會告訴您是否正在輸入重定向代碼。

+0

在請求啓動之前,頁面被定義爲HTTPS,提琴手確認。 – 2010-11-09 13:03:36

+0

嗯。點擊報告時網址是什麼樣的?它是提供csv文件的頁面的相對路徑嗎? – 2010-11-09 13:11:47

+0

這是回送響應的相同頁面。每個報告都有一個鏈接,當用戶單擊鏈接時,上面的第一個示例代碼塊將使用csvResults變量中正確的csv數據執行。 – 2010-11-09 13:29:38

2

正如Brian說,Eric Law的帖子是爲了解開這個謎團的關鍵......

快速的解決方案是:

Response.ClearHeaders(); 
Response.AddHeader("Cache-Control", "no-store, no-cache"); 

(與無法解釋的事實,即‘無店鋪’必須在'no-cache'之前爲

+0

那第二行是我的銀彈。謝謝 – Amalgovinus 2011-09-06 20:48:54

0

使用IIS 7。5+使用URL Rewrite extention添加一個出站規則以去除Cache-Control頭中的「no-store」值,並去除Pragma頭(這從不需要)。這個規則集可以做到這一點:

<outboundRules> 
    <rule name="Always Remove Pragma Header"> 
     <match serverVariable="RESPONSE_Pragma" pattern="(.*)" /> 
     <action type="Rewrite" value="" /> 
    </rule> 
    <rule name="Remove No-Store for Attachments"> 
     <conditions> 
      <add input="{RESPONSE_Content-Disposition}" pattern="attachment" /> 
     </conditions> 
     <match serverVariable="RESPONSE_Cache-Control" pattern="no-store" /> 
     <action type="Rewrite" value="max-age=0" /> 
    </rule> 
</outboundRules> 
相關問題