代码之家  ›  专栏  ›  技术社区  ›  Brian Scott

为什么IE无法从response.write服务器我的csv文件?

  •  2
  • Brian Scott  · 技术社区  · 14 年前

    我最近开发了一个列出一系列报告的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();
    

    代码最初在所有浏览器中都可以正常工作。然后,客户机提出了一个要求,要求为站点使用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无法打开 此Internet站点。请求的站点 不可用或不能 找到。请稍后再试。“

    更新:

    下面是一些例子,fiddler输出从页面请求返回,看起来它的服务是正确的。为什么我不明白这只是一份文件?

    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"
    
    4 回复  |  直到 14 年前
        1
  •  7
  •   Brian Scott    14 年前

    在花了几个小时试图解决这个问题之后,我终于想出了一个解决办法。

    幸好我遇到了 a post by Eric Law 关于IE在包含缓存指令的HTTPS和响应头之间的不兼容性。

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

        2
  •  2
  •   oori    13 年前

    正如布莱恩所说, Eric Law 他的帖子是解开这个谜团的关键…

    快速解决方案是:

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

    (无法解释的事实是,“没有商店”必须 之前 '无缓存')

        3
  •  0
  •   Kevin Tighe    14 年前

    不确定这是否可以解决您的问题,但我会再次检查csv文件的请求最初是用https发出的,以避免在应用程序_BeginRequest中进行重定向。

    你可以用 Fiddler 查看正在发出的所有请求,这将告诉您是否点击了重定向代码。

        4
  •  0
  •   Geoffrey McGrath    10 年前

    对于IIS 7.5+使用 URL Rewrite extention 添加出站规则以除去缓存控制头中的“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>