У меня есть приложение ASP.net, которое возвращает двоичный файл PDF (сохраненный из базы данных, которая была ранее загружена) клиенту.
Код, который у меня есть, отлично работает для всех браузеров, кроме Internet Explorer 6 (история моей жизни!). В IE6, когда пользователь нажимает кнопку «Открыть», Adobe сообщает об ошибке: «Произошла ошибка при открытии этого документа. Файл не найден».
Когда пользователь нажимает кнопку «Сохранить», файл PDF отлично сохраняется и его можно открыть, дважды щелкнув его. Я в тупике. Google предложил варианты кэширования (настройка cachecontrol на private и т. Д.), И я попробовал все это, но ничего не помогло.
Странное поведение (er) - когда я с нуля создаю PDF на своем уровне сервера ASP .net (используя NFop), IE прекрасно его открывает (используя тот же код!).
Вот мой код для отправки двоичных данных по проводам:
// Firefox doesn't like spaces in filenames.
filename = filename.Replace(" ", "_");
string extension = Path.GetExtension(filename);
string contentType;
switch (extension)
{
case "pdf":
contentType = "application/pdf";
break;
default:
contentType = "application/x-unknown";
break;
}
context.Response.Clear();
context.Response.AddHeader("content-disposition", "attachment;filename=" + filename);
context.Response.Charset = "";
context.Response.ContentType = contentType;
context.Response.BinaryWrite(data);
context.Response.Flush();
Вот версии приложения:
- ASP .net 3.5
- IE6.0.2900.2180.xpsp_s
- Элемент списка
- p2_gdr.091208-2028
- Adobe Reader версия 8.0.0
- Windows XP SP 2
- SQL Server 2008
Любая помощь / предложения будут высоко оценены. Спасибо :)
РЕДАКТИРОВАТЬ:
Я подключил Fiddler для просмотра заголовков и, конечно же, это похоже на проблему с кэшированием. гррр!
Когда загружается мой NFop PDF (тот, который работает), он отправляет cache-control = private.
При загрузке моего вложения PDF (тот, который не работает), он отправляет без кэширования.
Я посмотрел в объекте Response, и оба они имеют одинаковые заголовки при вызове context.Response.Flush ().
Все еще в тупике!
решаемые
Где-то в нашей структуре был мошеннический метод, который вызывался с помощью отражения:
///
/// Устанавливает истечение срока действия запроса и не вызывает кеш
///
Защищенный void SetCacheExpiration (контекст HttpContext)
{
// устанавливает срок действия кэша немедленно
context.Response.Cache.SetCacheability (HttpCacheability.NoCache);
context.Response.Cache.SetSlidingExpiration (истина);
context.Response.Cache.SetExpires (DateTime.Now);
context.Response.Cache.SetMaxAge (new TimeSpan (0, 0, 0));
context.Response.Cache.SetNoStore ();
context.Response.Cache.SetAllowResponseInBrowserHistory (ложь);
context.Response.Cache.SetValidUntilExpires (ложный);
context.Response.Cache.SetRevalidation (HttpCacheRevalidation.AllCaches);
}
Спасибо за вашу помощь, кеширование! Интересно, что единственным браузером, который фактически не кэшировал загрузку (при открытии), был IE6.