2010-11-10 1 views
1

Меня попросили выполнить требование безопасности, которое мы поручаем браузерам не кэшировать важные данные. Это все хорошо для содержания ASPX, используя стандартные инструкции:IE, не показывающий файлы PDF с кэшированием отключен

 Response.Expires = -1; 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.Cache.SetNoStore(); 

Однако, когда я установил эти заголовки для загрузки PDF, IE8 не будет показывать PDF (не пробовал другие версии IE еще, своего рода спорно, Мне нужно, чтобы он работал над всеми из них, даже IEfreaking6). Кажется, работает в firefox 4 beta, но я не дважды проверял, что он определенно не кэширует его. Вот сокращенная версия кода, я использую, чтобы служить PDF-файлов:

 Response.Clear(); 
     Response.ClearHeaders(); 
     Response.ClearContent(); 
     Response.Buffer = true; 

     //This stops the PDFs from being viewed :(
     //Response.Expires = -1; 
     //Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     //Response.Cache.SetNoStore(); 

     Response.ContentType = mime; 
     Response.AddHeader("Content-Disposition", disposition); 

     Response.BinaryWrite(file); 

     Response.End(); 

Где в случае PDF-файлов типа мим установлено значение:

 private const string mimeTypePDF = "application/pdf"; 

Диспозиция устанавливается на:

 var disposition = String.Format("{0};filename=\"{1}\"", SendInline ? "inline" : "attachment", Path.GetFileName(filename)); 

Я буду играть вокруг немного больше, может заставить их загрузить в MimeType «приложение/октет-поток» может работать, но это было бы остановить хорошую открытый PDF-е в новом окне браузера от за работой.

Неужели кто-нибудь имел успех с тем, чтобы IE не кэшировал PDF-файлы со стороны сервера и успешно отображал их?

Просто, чтобы дать яркий пример о том, что происходит. В одном сценарии пользователь может выбрать группу отчетов из списка, они скомпилированы в PDF, а PDF - в новом окне браузера. Когда кеширование включено, открывается окно браузера, но остается решительно пустым.

+0

См. Также: http://forums.asp.net/p/1630929/4207658.aspx/1?Re+https+pdf+problems+ – jamiebarrow

ответ

0

Я собираюсь сказать, что в настоящее время это невозможно, ничего, что я пытался, казалось, заставляло его работать. Попробуйте и попросите ваших клиентов использовать Firefox вместо этого! :)

2

У меня была такая же проблема с IE несколько лет назад, и пусть это кеш, так как у меня не было требования запретить его.

Однако, поскольку пользователи могут сохранять PDF-документ, как только браузер показывает его, как вы планируете запретить им это делать?

Не то, чтобы это решило вашу проблему, но при отправке физических файлов вам следует выполнить Response.TransmitFile вместо BinaryWrite. Это намного быстрее и эффективнее с точки зрения использования памяти, так как вам не нужно загружать весь файл в память перед его отправкой.

+0

Если они сохраняют его где-то небезопасным, то это официально считается не нашей проблемой. Я не изобретал требования к безопасности, мне просто нужно их реализовать. В этом случае нет физического файла, PDF-файлы генерируются «на лету», это просто массив байтов. –

+0

Хорошо, это было непонятно, так как вы извлекаете имя из пути к файлу в строке Content-Disposition, и у вас есть что-то под названием «файл», поэтому я подумал, что добавлю два своих бита :). В последний раз, когда я занимался документами PDF, и IE был несколько лет назад (IE 6), и система все еще используется, но я не вернулся к этой части кода, чтобы попытаться ее исправить. Просто подумал, что вы должны знать, что вы не единственный в этом вопросе :). Это действительно ошибка Adobe в своем элементе управления ActiveX. Вы проверили свой сайт, чтобы узнать, есть ли решение? –

+0

Я не проверил, я сделаю это! Вы можете исправить это на стороне клиента, поскольку мы обслуживаем HTTPS, в IE есть параметр «Не хранить зашифрованные документы», который, если вы включите, имеет желаемый эффект. Кажется, что что-то должно быть возможно, если срабатывает волшебная комбинация шкивов и рычагов. –

0

Я также считаю, что это ошибка в Internet Explorer. Я устанавливал заголовок cache-control на no-cache и имел ту же проблему. Также обратите внимание, что в разделе «Свойства обозревателя»> «Дополнительно»> «Безопасность» есть опция «Не сохранять зашифрованные страницы на диск», которая может повлиять на нее.

Удаление заголовка cache-control ответа отменило мою проблему. Я также попытался проверить вышеупомянутый вариант, и он, казалось, работал еще лучше для меня. В начале хранения PDF-файла в %LocalAppData%\Microsoft\Windows\Temporary Internet Files это фактически заставило IE8 выпустить диалог, позволяющий мне выбрать, где его сохранить (что на самом деле я хотел в моем случае).

1

Похоже, что эта проблема была решена в IE9.

теперь я могу успешно выполнить следующие действия:

Response.Expires = -1 
    Response.Cache.SetNoStore() 
    Response.AppendHeader("Pragma", "no-cache") 
    Response.ContentType = "application/pdf" 
    Response.BinaryWrite(myByteBuffer) 
    Response.Flush() 
    Response.Close() 

Наслаждайтесь!

0

Эта проблема с отображением PDF (и других типов документов) в браузере с использованием заголовка без кэша была подана как ошибка для Microsoft: http://support.microsoft.com/kb/316431. Когда вы пытаетесь открыть документ в этом случае, IE пытается прочитать его из кеша, но его там нет.

К сожалению, люди в M $ сказали, что это «работает в соответствии с проектом», и пользователям не следует использовать заголовок no-cache ... go figure.