Проблемы с 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.
Это, вероятно, объясняет, почему вам нужно использовать бинарный / октет.