2010-11-09 52 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> 
相关问题