Неправильная ошибка PDF в IE6 и IE7 с https
Вопрос
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 он приводит к диалогу Save-AS (не 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. Опен за кнопкой, это имеет тот же эффект
- При Googling для потоковой передачи PDF вы можете обнаружить, что многие люди испытывают проблемы с этим, в основном они устанавливают длину заголовка или другие свойства или статические флаги сжатия файлов в IIS.Я довольно уверен, что попробовал их все.
- Настройки считывателя Adobe Acrobat, настройки браузера или любые другие настройки на стороне клиента, кажется, не являются проблемой.Протестировано на разных машинах, с HTTP Works, с 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
Решение 3
После множества проб и ошибок я нашел работающее решение, но до сих пор не понимаю, почему другой код не работает.
Этот код работает:
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());
Другие советы
Возможность открытия вложений так, как вы хотите, во многом зависит от отправляемых вами заголовков.Если вы перейдете на страницу .aspx, которую хотите использовать в качестве динамического ресурса PDF, эти HTTP-заголовки становятся все более важными.
Этот сайт указывает ряд причин, по которым он может не работать в IE.
- Установите тип содержимого ответа «application/pdf», например.response.setContentType("приложение/pdf");
- Добавьте фиктивный параметр в конце URL-адреса, например: http://x.y.z/DoGenCompStmt?filename=dummy.pdfпотому что IE игнорирует типы контента, поэтому вам нужно дать ему подсказку, а расширение «.pdf» — простой способ.
- Установите «длину контента» в ответе, иначе плагин Acrobat Reader может работать неправильно, например.response.setContentLength(bos.size());
- Дополнительная вещь, которая, похоже, помогает некоторым браузерам IE, — это наличие:response.setHeader("Content-Disposition", "inline;filename=somepdf.pdf");
РЕДАКТИРОВАТЬ: поскольку вы уже попробовали все вышеперечисленное, я могу только указать вам на RFC для размещения контента насколько мне известно, это единственный способ сообщить браузеру, как обращаться с двоичным содержимым.
РЕДАКТИРОВАТЬ:что действительно помогло бы, так это увидеть заголовки HTTP, которые он в настоящее время возвращает, когда вы пытаетесь открыть PDF-файл в браузере. Fiddler отлично справляется с ловлей трафика
Для обслуживания такого типа контента лучше использовать общий обработчик (.ASHX), чем пытаться заставить веб-страницу отображать контент, отличный от HTML.
Если вы получаете пустую страницу при попытке просмотреть встроенный PDF-файл в браузере IE7 и используете Acrobat версии 6.Обновите версию Acrobat, чтобы решить проблему.
Обратите внимание, что эта проблема не связана с HTTPS, та же проблема (и то же исправление) применима и к HTTP.
Исправление работает, поскольку проблема IE заключается в том, что он не отображает PDF-файл в окне, открытом с помощью сценария, если PDF-файл загружается сразу.(Неизвестно почему, но это суть проблемы и ее решение.)
Я заметил, что ваш возвращенный тип контента заблокирован
"Тип содержимого:приложение/pdf;кодировка = utf-8"
При потоковой передаче содержимого на страницу aspx убедитесь, что вы установили
Response.charset = ""