2009-03-05 1 views
0
Response.Write("<script language=\"javascript\">window.open(with https and pdf 

Что мы делаем в 1.1.4332 приложении Asp.Net является следующее:PDF неправильно ошибка в IE6 и IE7 с HTTPS

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

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

это открывает страницу, на которой потоки в формате PDF в новом окне браузера

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

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 то код работает, но только не в новом окне

Любая помощь будет высоко ценится!


В соответствии с просьбой заголовки, как показано Скрипач:

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 

ответ

0

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

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

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

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

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

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

EDIT:, так как вы уже пробовали все выше, я могу указать вам только rfc for content disposition, который к моему знанию это единственный способ сообщить браузеру, как иметь дело с двоичным контентом.

EDIT: что действительно поможет увидеть заголовки HTTP, которые он в настоящее время возвращает, когда вы пытаетесь открыть PDF в браузере. Fiddler does a great job at catching traffic

+0

Да, спасибо за усилия. Но я все это пробовал. – KeesDijk

0

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

+0

Спасибо за предложение. Я просто попробовал это, и это похоже на более чистое решение. Однако это не решает мою проблему. Результат тот же. – KeesDijk

0

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

0

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

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

+0

Нет, это не так. Конкретный образец в вопросе работал в HTTP, а не в HTTPS. Возможно, в некоторых случаях с http у вас есть другая проблема, которая может быть решена таким же образом, но исходная проблема возникла только с HTTPS. – KeesDijk

0

Я заметил, что возвращенное ваше содержание типа обливали

«Content-Type: применение/PDF, кодировка = UTF-8 "

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

Response.charset = "" 
Смежные вопросы