2009-12-08 4 views
4

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

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

Я создал небольшую встроенный 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> и ее закрытие теги.

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

+0

Вы можете отправить ссылку на образцы, которые вы указали. – Saar

ответ

0

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

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

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

1

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

попробовать

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

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

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

Слишком плохо, что не позволяет отправлять двоичные потоки. – Nuzzolilo

0

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

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

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

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