2009-07-30 2 views
1

Я динамически генерирую Zip-файл на странице ASP.NET, а затем отправляю поток в Response.Поток файла в ASP.NET работает в Firefox, но не в Internet Explorer

В Firefox я могу скачать файл с именем Images.zip. Он работает правильно. В Internet Explorer 7 он пытается загрузить файл с именем ZipExport.aspx или если он находится в общем обработчике ZipExport.ashx, и он говорит, что он не может быть найден на сервере и не работает.

Вот мой код:

Response.BufferOutput = true; 
Response.ClearHeaders(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("content-disposition", "attachment; filename=Images.zip"); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoServerCaching(); 
Response.Cache.SetNoStore(); 
Response.Cache.SetMaxAge(System.TimeSpan.Zero); 
ZipFile zip = new ZipFile(); 
zip.AddFile(Server.MapPath("sample1.png")); 
zip.Save(Response.OutputStream); 

Я не хочу, чтобы сделать HttpHandler для определенного файла и зарегистрировать его с IIS.

Есть ли что-то простое, что мне не хватает или Internet Explorer по ошибке за игнорирование моего заголовка содержимого?

Edit: я удалил эти строки и все работало:

Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 

Edit: Вот рабочий код, если кому-то интересно:

public void ProcessRequest(HttpContext context) 
{ 
    context.Response.Clear(); 
    context.Response.BufferOutput = false; 
    context.Response.ContentType = "application/octet-stream"; 
    context.Response.AddHeader("content-disposition", 
     "attachment; filename=ChartImages.zip"); 
    context.Response.Cache.SetNoServerCaching(); 
    context.Response.Cache.SetMaxAge(System.TimeSpan.Zero); 
    using(ZipFile zip = new ZipFile()) 
    { 
     zip.AddFile(context.Server.MapPath("sample1.png")); 
     zip.Save(context.Response.OutputStream); 
    } 
    context.ApplicationInstance.CompleteRequest(); 
} 
+0

В качестве побочной проблемы вы можете установить BufferOutput в false. – RichardOD

+0

действительно ли fiddler дает вам любую информацию по этой проблеме? – BigBlondeViking

ответ

3

Replace Response.End с HttpContext.Current.ApplicationInstance.CompleteRequest

Попробуйте сократить версия для печати:

Response.Clear(); 
Response.BufferOutput = false; 

Response.ContentType = "application/zip"; 
Response.AddHeader("content-disposition", "attachment; filename=Images.zip"); 
using(ZipFile zip = new ZipFile()) 
{ 
    zip.AddFile(Server.MapPath("sample1.png")); 
    zip.Save(Response.OutputStream); 
} 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 

Ошибка при использовании Microsoft Fiddler, чтобы узнать, что еще может произойти неправильно.

+0

Я выбираю это как ответ, так как он решает проблему. После дополнительного тестирования проблемная строка выглядит как Response.Cache.SetCacheability (HttpCacheability.NoCache); – Chet

+0

@ Чет- это хорошо. Иногда возврат к более базовой версии помогает определить проблему. – RichardOD

+0

Рад, что вы его отсортировали. –

3

Вы должны создать ASHX Handler для что. Вы пытались использовать тип контента «application/zip» вместо этого?

+0

Да, у меня есть. Тот же вопрос. – Chet

+0

Хороший вопрос о приложении/zip. – RichardOD

+0

Также хороший вопрос об использовании IHttpHandler. – RichardOD

2

Вместо Response.ClearHeaders(), сделать полный Response.Clear(), и после этого, сделать response.end()

+0

Да-не делает Response.Clear может быть причиной. – RichardOD

+0

Хорошие идеи, но я не думаю, что это действительно связано с основной проблемой. – Chet

0

Я никогда не использовал ZipFile класс, который, как говорится, когда я отправлять файлы я использую Response.BinaryWrite()

//Adds document content type 
context.Response.ContentType = currentDocument.MimeType; 
context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
context.Response.AddHeader("content-disposition", "attachment;filename=\"" + currentDocument.Name + "\""); 



//currentDocument.Document is the byte[] of the file 
context.Response.BinaryWrite(currentDocument.Document); 

context.Response.End(); 
+0

Спасибо, да, я это считал. ZipFile.Save - это удобный метод, который API рекламирует для использования именно для этой цели. Конечно, он отлично работает в Firefox. – Chet

+0

, если IE работал как FF, нам все заплатили бы меньше ... :) – BigBlondeViking

1

Я просто столкнулся с той же проблемой (и исправление) спасибо.

Одним из пунктов, которые могут помочь будущим поисковикам, является то, что проблема возникла только для меня на сайтах HTTPS. Код работал нормально на моем HTTP-сервере.

Я думаю, что с HTTPS он не будет кэшироваться в любом случае, поэтому может быть заключен в условие «if (Request.IsSecureConnection)».

0

я просто столкнулся с такой же вопрос и удалось зафиксировать

Response.Clear(); Response.BufferOutput = false;

    Response.ContentType = "application/zip"; 
        //Response.AddHeader("content-disposition", "inline; filename=\"" + ArchiveName + "\""); 
        Response.AddHeader("content-disposition", "attachment; filename=\"" + ArchiveName + "\""); 
        zipFile.Save(Response.OutputStream); 
        // Response.Close(); 
        HttpContext.Current.ApplicationInstance.CompleteRequest(); 
        Response.Clear(); 
        Response.End(); 

 Смежные вопросы

  • Нет связанных вопросов^_^