为什么IE无法从Response.Write服务我的CSV文件?

Bri*_*ott 2 asp.net internet-explorer content-type header download

我最近开发了一个Web用户控件,列出了一系列报告.当用户点击报告时,它使用以下代码在响应流中回送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();
Run Code Online (Sandbox Code Playgroud)

该代码最初在所有浏览器中都运行良好.然后客户端要求为站点使用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:"));
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,由于使用SSL保护站点,因此CSV文件下载不再适用于IE,尽管它们可以继续用于Firefox/Chrome/Safari.

为了使文件响应正常工作,我在IE中独有的标题中是否缺少某些内容?

我从IE收到的消息是:

"Internet Explorer无法从.....中下载Reports.aspx ......

Internet Explorer无法打开此Internet站点.请求的网站不可用或无法找到.请稍后再试."

更新:

这是一个从页面请求返回的示例fiddler输出,看起来它正常服务.为什么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"
Run Code Online (Sandbox Code Playgroud)

Bri*_*ott 7

花了好几个小时试图解决这个问题后,我终于想出了一个解决方案.

幸运的是,我成功地遇到了Eric Law关于IE在HTTPS和包含缓存指令的响应头之间不兼容的帖子.

现在确保所有响应标头都已清除,并且没有对响应执行缓存指令,然后文件再次开始响应下载.