Невозможно отобразить PDF из HTTPS в IE 8 (на 64-разрядной версии Vista)

У меня есть домашний сервер 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 файл). Очищенный кеш/файлы cookie и т.д.

Существуют ли какие-либо известные проблемы с IE/PDF/HTTPS?

Ответ 1

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

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

Я последовал совету EricLaw и установил:

Cache-Control: private 

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

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

Ответ 2

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

... then с мгновенной паникой, я начал смотреть на код (ASP.NET с помощью VB). Я использовал fiddler и обнаружил, что даже когда я не указывал заголовок управления кешем, казалось, что Framework автоматически определял для меня отсутствие магазина. Ключ к решению проблемы был фактически в этом вопросе 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()                                

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

Ответ 3

response.setHeader("Cache-Control","private");

сделал трюк для нас в IE8 и IE9.

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

Ответ 4

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

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

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

Ответ 5

Я не вижу ссылки на .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 (в браузере).

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

            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);
            }

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