Проблемы с Response.TransmitFile, Response.End и IE

Я разрабатываю приложение ASP.NET, которое в какой-то момент отправляет файл пользователю, используя Response.TransmitFile.

Он отлично работает на моем компьютере разработчика, и когда я развертываю его на тестовых серверах, он все еще работает на двух из них; хотя на одном из серверов (W2K3) он работает только в Firefox, когда я пробую его в IE7, я получаю сообщение об ошибке типа "Internet Explorer не может открыть файл sendfile.aspx в (имя сервера)".

Я создал небольшую встроенную страницу aspx, чтобы воспроизвести проблему, вот она:

<%@ Page Language="C#" %>
<html><head>
<script language="CS" runat="server">
    void Page_Load(object sender, System.EventArgs e) 
    {
        string filePath = @"C:\temp\export.zip";
        Response.ClearHeaders();
        Response.ContentType = "application/zip";
        Response.Clear();
        Response.AppendHeader("Content-disposition", "attachment; filename=export.zip");
        Response.TransmitFile(filePath);
        Response.End();
    }
</script>
</head></html>

Я пробовал разные вещи, и я заметил, что это работает снова, если я закомментирую Response.End строка (но AFAIK эта строка должна быть там, по крайней мере, в соответствии с каждым примером кода, который я нахожу в Интернете)

Еще одна проблема, которую я заметил, которая может или не может быть связана с тем, что она также потерпит неудачу, если я удалю <html>, <head> и его закрывающие теги.

Я уже некоторое время ломал голову над этим, кто-нибудь знает, как заставить это работать?

3 ответа

Не используйте Response.End();

пытаться

Response.TransmitFile(filePath);
Response.End();

на самом деле, после.NET 2.0, вы должны использовать

Response.TransmitFile(filePath);
context.HttpApplication.CompleteRequest();

Поскольку я не могу (пока) добавлять комментарии, вот небольшая заметка.

Помните о Response.End(), поскольку этот метод завершает поток, и после этой точки ничего не будет выполнено. Вы можете захотеть сделать Response.Flush() после TransmitFile(), чтобы убедиться, что все отправлено клиенту.

См. Этот вопрос для получения дополнительной информации о Response.End().

Очевидно, немного поздно, чтобы быть полезным для OP, но очевидно, что у файлов ZIP есть некоторые проблемы с типами MIME и сжатием IIS. Смотрите вики на SharpLibZip:

https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples

Response.ContentType = "application/zip" 'Если браузер получает искаженный zip-файл, сжатие IIS может вызвать эту проблему. Некоторые участники обнаружили, что ' Response.ContentType = "application/octet-stream" решил эту проблему. Может быть специфичным для Internet Explorer.

Это, вероятно, объясняет, почему вам нужно использовать бинарный / октет.

Другие вопросы по тегам