IE8: невозможно загрузить файл, отправленный через Silverlight и ASP.NET - PullRequest
1 голос
/ 26 января 2011

На нашем веб-сайте ASP.NET мы разработали страницу aspx, которая позволяет пользователю загружать файл. Путь к файлу отправляется в качестве параметра, а затем содержимое файла читается и записывается в поток ответов. Код, который мы использовали, следующий:

string filepath = HttpContext.Current.Request.Params["FilePath"];
Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(filepath));
Response.TransmitFile(filepath);
Response.Flush();

В нашей среде разработки все работает как положено, но когда мы используем этот фрагмент кода на нашем производственном сервере, мы заметили, что при попытке загрузить практически все виды файлов в браузере ничего не происходит. Он просто открывает новое окно для этой страницы aspx, но затем закрывается почти сразу. Это очень странно, поскольку мы безуспешно пытались загрузить файлы .pdf, .doc, .xls, .txt и изображения, за исключением некоторых (не всех) файлов .msg.

Мы искали подсказку, отслеживающую HTTP-трафик, достигающий браузера с помощью Fiddler, но мы не увидели ничего странного. Во всех случаях содержимое файла отправляется в браузер без каких-либо различий, поэтому кажется, что это браузер не показывает диалог открытия / сохранения / отмены.

Вот пример заголовков, полученных в браузере с ошибочным файлом:

HTTP / 1.1 200 OK Proxy-Connection: Keep-Alive Connection: Keep-Alive Длина контента: 421395 Через: 1.1 IBISA01 Дата: среда, 26 января 2011 12:02:54 GMT Тип контента: Сервер приложений / октет-потока: Microsoft-IIS / 7.5 Cache-Control: Частный Контент-Диспозиция: вложение; имя файла = P08-0656 Interflex Especificación Inteface SGA ERP Версия 0.1.pdf X-AspNet-Версия: 4.0.30319 X-Powered-By: ASP.NET

И это заголовки файла, который можно загрузить:

HTTP / 1.1 200 OK Proxy-Connection: Keep-Alive Connection: Keep-Alive Длина контента: 290816 Через: 1.1 IBISA01 Дата: среда, 26 января 2011 12:03:29 GMT Тип контента: Сервер приложений / октет-потока: Microsoft-IIS / 7.5 Cache-Control: Частный Контент-Диспозиция: вложение; имя файла = окончание Acalaracion Fichero ASCII ПРОВЕДОРЫ Interflex.msg X-AspNet-версия: 4.0.30319 X-Powered-By: ASP.NET

Во всех случаях полное содержимое файла появляется после заголовков без видимых проблем, связанных с кодированием.

Нам интересно, есть ли какая-нибудь возможность отладки или отслеживания активности Internet Explorer, чтобы понять, почему отказывается загружать файлы.

Веб-сервер имеет Windows Server 2008 R2 и IIS 7.5. Мы используем браузеры IE 8.0 поверх Windows 7.

Большое спасибо заранее.

Хосе Антонио Арроба

Ответы [ 3 ]

2 голосов
/ 26 января 2011

У нас была похожая проблема с PDF, попробуйте добавить это.

 Response.CacheControl = "no-cache";
 Response.AddHeader("Pragma", "no-cache");

Редактировать На самом деле это связано с вашими именами файлов:

Как кодировать имя файла UTF8 для заголовков HTTP? (Питон, Джанго)

Попробуйте удалить ó из примера, который не работает

1 голос
/ 02 февраля 2011

Наконец мы смогли увидеть, что происходило с этим странным поведением в Internet Explorer при попытке загрузки файлов. Я забыл упомянуть, что мы пытались загрузить файл из приложения Silverlight, которое вызывает страницу aspx, отвечающую за запись содержимого файла в ответе. Похоже, что механизм безопасности Internet Explorer рассматривает это поведение как автоматическую загрузку и блокирует его по умолчанию при просмотре с сервера не из интрасети.

Включение параметра «Автоматический запрос загрузки файлов» в настройках безопасности Internet Explorer для зоны Интернета решило проблему. Что нас до сих пор удивляет, так это то, что перед включением этого параметра мы смогли загрузить некоторые файлы.

Большое спасибо всем, кто пытался нам помочь. Надеюсь, что этот ответ может сэкономить время тем, кто может испытать то же самое в будущем.

С уважением,

Хосе Антонио Арроба

0 голосов
/ 26 января 2011

Попробуйте это для каждого случая ...

Dim strExtension as String = ""
Dim strType as String = ""

strExtension = Path.GetExtension(filepath)

Select Case strExtension.ToUpper()

Case ".PDF"
strType = "text/pdf"
Exit Select

CASE ".DOC"
strType = "text/doc"
Exit Select

End Select

Response.Clear()
Response.ClearHeaders()
Response.Buffer = True
Response.ContentType = strType
...