Почему IE не может сервер мой CSV-файл из Response.Write? - PullRequest
2 голосов
/ 09 ноября 2010

Недавно я разработал пользовательский веб-элемент управления, в котором перечислены серии отчетов. Когда пользователь нажимает на отчет, он возвращает загрузку файла 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:

Вот несколько примеров вывода 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"

Ответы [ 4 ]

7 голосов
/ 09 ноября 2010

Потратив часы на решение этой проблемы, я наконец-то нашел решение.

К счастью, мне удалось найти сообщение Эрика Лоу о несовместимости IE между HTTPS и заголовками ответов, содержащими директивы кэша.

Теперь убедившись, что все заголовки ответов былиочищен и что в ответе не выполнялось никаких инструкций по кэшированию, затем файл снова начал загружаться.

2 голосов
/ 01 февраля 2011

Как сказал Брайан, сообщение Эрика Лоу - ключ к разгадке этой тайны ...

быстрое решение:

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

(с необъяснимым фактом, что 'no-store' должно быть до 'no-cache')

0 голосов
/ 12 февраля 2014

В IIS 7.5+ используйте расширение URL Rewrite , чтобы добавить исходящее правило, чтобы убрать значение «no-store» в заголовке Cache-Control и удалить заголовок 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>
0 голосов
/ 09 ноября 2010

Не уверен, что это решит вашу проблему, но я бы дважды проверил, что запрос для файла csv изначально выполняется с помощью https, чтобы избежать перенаправления в Application_BeginRequest.

Вы можете использовать Fiddler для просмотра всех запросов, которые будут сообщать вам, если вы нажимаете код перенаправления или нет.

...