Ошибка PDF в IE6 и IE7 с https - PullRequest
       20

Ошибка PDF в IE6 и IE7 с https

0 голосов
/ 05 марта 2009
Response.Write("<script language=\"javascript\">window.open( with https and pdf

В приложении Asp.Net 1.1.4332 мы делаем следующее:

кнопка запускает серверное событие, которое выполняет некоторую обработку и помещает данные в объект сеанса, после чего выполняется следующий код:

string page = Request.ApplicationPath + "/ApkRapportPage.aspx";    
Response.Write("<script language=\"javascript\">window.open('" + page + "','_new');</script>");

это открывает страницу, которая передает PDF в новое окно браузера

в основном со следующим кодом (я знаю, что здесь чего-то не хватает, но это не очень важно для вопроса)

byte [] pdfbytes = Convert.FromBase64String (rapportB64);

Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = GetContentType(format);
string header = GetContentDispostionHeader(fileName, format, type);
Response.AddHeader("Content-Disposition", header);
Response.BinaryWrite(pdfbytes);         
Response.End();

Хорошо, этот код работает!

Только не в IE6 и IE7 при использовании HTTPS

При использовании IE6 с HTTPS появляется диалоговое окно сохранения как (не PDF-файл, который открывается в браузере) При использовании IE7 с HTTPS это приводит к пустому экрану При использовании Firefox он работает просто отлично

Если я имитирую дополнительную обработку на стороне сервера в page_load для помещения необходимых данных в сеанс и заменяю кнопку ссылкой, которая открывает ту же страницу создания PDF в новом окне, код работает.

Для реального применения невозможно получить необходимые данные до нажатия кнопки.

Так что мне бы очень хотелось, чтобы следующий код работал

string page = Request.ApplicationPath + "/ApkRapportPage.aspx";    
Response.Write("<script language=\"javascript\">window.open('" + page + "','_new');</script>");

Вопросы: Кто-нибудь знает, почему этот код не работает в IE6 и IE7 при использовании HTTPS? Что нужно для того, чтобы код заработал?

Дополнительная информация:

  • Я пытался не использовать response.write, но просто javascript window.open позади кнопка, это имеет тот же эффект
  • при поиске в потоковом режиме PDF вы можете найти множество людей, Беда с этим, в основном они поставили длины заголовков или другие свойства или флаги сжатия статических файлов в IIS. Я уверен, что попробовал их все.
  • Настройки Adobe Acrobat Reader, настройки браузера или любого другого клиента настройки стороны не кажутся проблема. Проверено на разных машины, с http работает, с https это не так.
  • Переключение между https и http может быть как-то связано с этим, но когда я установил IE, чтобы сказать мне, когда я переключаюсь, переключение не происходит происходят во время тестирования.
  • При замене части window.open на response.redirect код также работает, но не в новом окне

Любая помощь будет принята с благодарностью!


В соответствии с запросом заголовков, как показано Fiddler:

   HTTP/1.1 200 OK
   Server: Microsoft-IIS/5.1
   Date: Thu, 05 Mar 2009 14:18:36 GMT
   X-Powered-By: ASP.NET
   X-AspNet-Version: 1.1.4322
   Content-Disposition: Inline;filename=APKrapport.pdf
   Cache-Control: private
   Content-Type: application/pdf; charset=utf-8
   Content-Length: 28307

Ответы [ 6 ]

0 голосов
/ 02 декабря 2010

Я заметил, что ваш возвращенный тип контента скрыт

"Content-Type: application / pdf; charset = utf-8"

При потоковой передаче содержимого на страницу aspx убедитесь, что вы установили

Response.charset = ""
0 голосов
/ 02 декабря 2009

Обратите внимание, что эта проблема не связана с HTTPS, та же проблема (и то же исправление) применима для HTTP.

Исправление работает, потому что проблема с IE заключается в том, что он не отображает PDF в окне, открытом скриптом, если PDF загружен сразу. (Неизвестно почему, но в этом суть проблемы и ее исправления.)

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

Если вы получаете пустую страницу при попытке просмотра встроенного PDF-файла в браузере IE7 и используете Acrobat версии 6. Обновите версию Acrobat для решения проблемы.

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

После долгих проб и ошибок я нашел рабочее решение, все еще не уверенный, почему другой код не работает.

Этот код работает:

StringBuilder js = new StringBuilder("<script language=\"javascript\">");
js.Append("_window = window.open(\"\",'_new');");
js.Append("_window.document.open(\"application/pdf\");");
js.Append("_window.location.href = \"ApkRapportPage.aspx\";");  
js.Append("_window.document.close();");
js.Append("</script>");

Response.Write(js.ToString());

Должен иметь отношение к типу пантомимы.

Хотя есть проблема. Когда IE настроен на показ при переключении между HTTP и HTTPS, этот код выдаст это сообщение дважды. Следующий код не переключается, но вызывает двойную загрузку страницы ApkRapportPage.

StringBuilder js = new StringBuilder("<script language=\"javascript\">");
js.Append("_window = window.open(\"ApkRapportPage.aspx\",'_new');");
js.Append("_window.document.open(\"application/pdf\");");
js.Append("_window.location.href = \"ApkRapportPage.aspx\";");  
js.Append("_window.document.close();");
js.Append("</script>");

Response.Write(js.ToString());
0 голосов
/ 05 марта 2009

Вам лучше использовать универсальный обработчик (.ASHX) для обслуживания такого рода контента, чем пытаться заставить веб-страницу обслуживать контент, отличный от HTML.

0 голосов
/ 05 марта 2009

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

Этот веб-сайт приводит ряд причин, по которым он может не работать в IE.

  1. Установите тип содержимого ответа «application / pdf», напр. response.setContentType ( "применение / PDF");
  2. Добавить фиктивный параметр в конце URL, например: http://x.y.z/DoGenCompStmt?filename=dummy.pdf потому что IE игнорирует типы контента, поэтому вам нужно дать ему подсказку, а расширение ".pdf" - это простой способ.
  3. Установите «content-length» в ответе, в противном случае плагин Acrobat Reader может работать некорректно, напр. response.setContentLength (bos.size ());
  4. Еще одна вещь, которая, похоже, помогает некоторым браузерам IE, также иметь: response.setHeader ("Content-Disposition", "inline; filename = somepdf.pdf");

РЕДАКТИРОВАТЬ: , поскольку вы уже попробовали все вышеперечисленное, я могу лишь указать вам rfc для размещения контента , который, насколько мне известно, является единственным способом сообщить браузеру, как иметь дело с бинарным контентом.

РЕДАКТИРОВАТЬ : что действительно поможет, так это просмотреть HTTP-заголовки, которые он возвращает в настоящий момент при попытке открыть PDF-файл в браузере. Fiddler отлично справляется с ловлей трафика

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