Не удается отобразить PDF из HTTPS в IE 8 (в 64-битной Vista) - PullRequest
43 голосов
/ 24 июня 2009

У меня есть собственный HTTPS-сервер, который обслуживает простые файлы (он встроен в мое приложение). Он прекрасно работает - использую его вечно.

Недавно добавлена ​​поддержка SSL - Chrome, FireFox и IE понравились и прекрасно загружают страницы.

Проблема, которую я обнаружил, заключается в том, что я пытаюсь загрузить PDF-файл через HTTPS-соединение. По некоторым причинам, PDF никогда не отображается в IE 8 (64-разрядная на 64-разрядной Vista). Он отлично работает в Chrome. И он отлично работает в IE 8 при использовании простого HTTP - только сбой при использовании HTTPS.

ПРИМЕЧАНИЕ. Когда упоминается IE 8, это 32-битный IE 8 в 64-битной Vista, хотя 64-битный IE 8 работает аналогично.

Это заставляет меня думать, что это какая-то проблема с IE 8 / HTTPS / PDF / 64-битной ОС, но я не уверен.

DebugBar для IE 8 показывает, что запрос и ответ прошли точно так же, как и ожидалось - ошибок вообще нет. IE 8 не показывает никаких ошибок или чего-либо еще - чисто белый экран (или страницу, которая отображалась до того, как я пытался загрузить PDF). Очистил кеш / куки / и т.д.

Есть ли какие-либо известные проблемы с IE / PDF / HTTPS?

Ответы [ 8 ]

39 голосов
/ 29 октября 2009

Думаю, я вернусь и дам окончательный ответ.

Спасибо всем, кто предложил "Не сохранять зашифрованные страницы на диск".

Я последовал совету Эрика и установил:

Cache-Control: private 

Я также обнаружил, что у меня есть Pragma: no-cache, который я удалил.

Теперь работает как шарм:)

10 голосов
/ 30 декабря 2010
response.setHeader("Cache-Control","private");

сделали свое дело для нас в IE8 и IE9.

Это не требует изменения настроек в браузере.

10 голосов
/ 17 июля 2009

Я столкнулся с этой же проблемой и смог заставить ее работать, только попросив пользователя изменить свои настройки безопасности, чтобы отключить Не сохранять зашифрованные страницы на диск на вкладке "Дополнительно" в свойствах Интернета диалог: http://support.microsoft.com/kb/812935

... затем с немедленной паникой, я начал смотреть на код (ASP.NET с использованием VB). Я использовал fiddler и обнаружил, что даже когда я не определял заголовок элемента управления кэшем, мне казалось, что Framework автоматически определяет no-store для меня. Ключ к решению проблемы на самом деле был в этом вопросе PHP . Если для заголовка элемента управления кэшированием установлено значение max-age = 1 , файл будет кэшироваться в течение 1 секунды, достаточно долго, чтобы Adobe Reader мог взять его с диска и загрузить в память. Я обновил наш код для создания PDF следующим образом:

Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("cache-control", "max-age=1")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=whatever.pdf")
Response.AddHeader("content-length", mem_stream.Length.ToString)
Response.BinaryWrite(mem_stream.ToArray())
Response.Flush()
Response.End()                                

Обновление: Я думал, что это работает, но я думаю, что говорил слишком рано. Я создал новый вопрос , чтобы решить эту проблему.

4 голосов
/ 02 ноября 2009

У меня была похожая проблема с IE8 и https. Когда я попытался передать поток PDF в новое окно, вместо этого я получил пустую HTML-страницу (это работало в FireFox, а если не было через https) После долгих поисков и проб разных вариантов заголовков ответов, решение для меня было установить:

Response.AppendHeader("Accept-Ranges", "none");

Это загружает весь PDF-файл перед его открытием, что менее удобно для пользователя, если это очень большой PDF-файл. Но в моем случае большинство PDF-файлов было всего несколько страниц. Надеюсь, это кому-нибудь поможет.

3 голосов
/ 11 июля 2009

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

Вот метод, который я использовал ранее для рендеринга PDF-файлов в браузере через HTTPS без ** кэширования.

    private void RenderPdfToResponse(byte[] documentBytes) {
        Response.BufferOutput = true;
        Response.ClearContent();
        Response.ClearHeaders();
        Response.AddHeader("Cache-control", "no-store");
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Length", documentBytes.Length.ToString());
        Response.BinaryWrite(documentBytes);
        Response.Flush();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }

** Существует псевдо-кэш , который достаточно велик, чтобы Adobe Reader мог загрузить файл PDF. Я искал ссылку, описывающую то, о чем я говорю, и случайная ветка форума - лучшее, что я мог сделать:

IE сохраняет PDF в выделена «энергозависимая» память и места указатель в% system% Temp. Это единственное место, где хранится файл. указатель удален и размещен память освобождается, как только Adobe Считыватель закрыт.

Я не могу ручаться за техническую точность, но она отражает то, что я наблюдал, используя метод выше. На самом деле, я думаю, что этот файл исчезает в тот момент, когда он завершает загрузку в Adobe Reader (в браузере).

0 голосов
/ 06 марта 2015

Мое решение (нам потребовались дни, чтобы поиграть с заголовками, чтобы это сработало):

            if (System.Web.HttpContext.Current.Request.Browser.Browser == "InternetExplorer"
                && System.Web.HttpContext.Current.Request.Browser.Version == "8.0")
            {
                System.Web.HttpContext.Current.Response.Clear();
                System.Web.HttpContext.Current.Response.ClearContent();
                System.Web.HttpContext.Current.Response.ClearHeaders();
                System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";

                System.Web.HttpContext.Current.Response.AppendHeader("Pragma", "public");
                System.Web.HttpContext.Current.Response.AppendHeader("Cache-Control", "private, max-age=60");
                System.Web.HttpContext.Current.Response.AppendHeader("Content-Transfer-Encoding", "binary");

                System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + document.Filename);
                System.Web.HttpContext.Current.Response.AddHeader("content-length", document.Data.LongLength.ToString());

                System.Web.HttpContext.Current.Response.BinaryWrite(document.Data);
            }

Надеюсь, что кому-то поможет

0 голосов
/ 01 сентября 2009

Как пользователь, у меня возникла та же проблема при загрузке PDF-файлов с Schwab.com. Совет «выключать Не сохранять зашифрованные страницы на диск» на вкладке «Дополнительно» диалогового окна «Свойства обозревателя»: http://support.microsoft.com/kb/812935" работает для меня.

0 голосов
/ 24 июня 2009

Вы используете 32-битную или 64-битную версию IE на Vista 64? Это идет с обоими. В большинстве случаев используется 32-битная версия, так как не многие плагины поддерживают 64-битную версию.

Я бы проверил, есть ли разница между ними. Если он работает в IE 8 32-разрядная версия на Vista 64, то это может быть проблема с 64-разрядной версией Browser Helper Object (BHO).

Кроме того, проверьте (через наличие диспетчера задач «* 32» после имени процесса), работают ли другие браузеры в 32-битном режиме.

Еще одна вещь, которую я хотел бы проверить, если HTTPS заставляет IE8 по какой-то причине не кэшировать PDF-файл (трафик HTTPS обычно не кэшируется). Я бы запустил procmon , чтобы посмотреть, замечаете ли вы файл PDF, записываемый в файловую систему. Там могут быть настройки политики, которые вам может потребоваться изменить. Я не уверен, есть ли альтернативный способ сказать, что у вас есть PDF, который не должен быть записан на диск, но все же может отображаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...