Вопрос

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.

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

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

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

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

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

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

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

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

"Тип содержимого:приложение/pdf;кодировка = utf-8"

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

Response.charset = ""
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top