PDF в модальном iframe отображается пустым в IE

ИЗМЕНИТЬ 2

Похоже, что перемещение тега объекта в Dom является причиной проблемы. Я добавил iframe прямо на страницу, и он отлично работает без проблем.

Однако, когда я перемещаю этот iFrame в модальное диалоговое окно (http://www.ericmmartin.com/projects/simplemodal/) PDF-файл исчезает (тег объекта больше не отображается правильно).

Таким образом, похоже, что это уже не вопрос моего обработчика, а скорее вопрос о том, почему перемещение тега «объект» (или встраивания) в DOM (который находится внутри iFrame) приводит к его «отключению».

Кроме того, когда PDF-файл перемещается из модального диалога обратно в исходное положение, он отображается правильно. Так что, возможно, мне стоит больше сосредоточиться на самом модальном диалоге.

Мысли? Спасибо за ваши предложения.


ИЗМЕНИТЬ 1

Итак, я сделал некоторые модификации для тестирования.

У меня есть iframe для вывода тега объекта для запросов PDF вместе с серверным временем.

Response.AddHeader("content-type", "text/html");
WebClient client = new WebClient();
Response.Write("<html><head></head><body><h1>"+ DateTime.Now.ToString() + "</h1><object height='100%' width='100%' name='plugin' data='" + Request.Url.ToString() + "&embed=true' type='application/pdf' /></body></html>");
Response.Flush();
Response.Close();
Response.End();

Теперь я правильно получаю страницу с текущим временем, но объект отображает PDF-файл только в первый раз после публикации страницы aspx. Значит, это какая-то проблема с кешированием? За исключением того, что объект ничего не загружает (даже ранее загруженный PDF-файл).

Если щелкнуть правой кнопкой мыши по iframe и обновить страницу, объект загрузится нормально. (То же самое верно, если я использую тег для встраивания).


Исходный вопрос

Я знаю, что по этому поводу много вопросов ...

Но им либо не ответили, либо ответ не сработал.

Окружающая среда

  • .Net 4
  • Adobe 9.3.4
  • IIS 5.1
  • XP sp3
  • VS 2010
  • IE 8.0.6001.18702

Фон

PDF-файлы, которые я транслирую, поступают из репозитория хранилища, где файлы не имеют расширений (это сделано в целях безопасности). Я ищу файл в базе данных и передаю его обратно клиенту с помощью следующего кода:

Response.Clear();
WebClient client = new WebClient();
Byte[] buffer = client.DownloadData(sPath);
Response.AddHeader("content-length", buffer.Length.ToString());
Response.AddHeader("content-disposition", "inline;filename=" + fileName);
Response.AddHeader("expires", "0");
Response.AddHeader("Content-Type", "application/pdf"); //this is usually dynamic to support other types (doc, xls, txt, etc.)
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
Response.Close();
Response.End();

Это работает для всех типов файлов (doc, txt, xls, html) при использовании непосредственно в браузере или в iframe (отображается как модальное всплывающее окно) за исключением pdf файлы. Они не работают надежно при доступе через iframe, но отлично работают при доступе непосредственно в браузере.

Единственный раз, когда это работает, - это когда я впервые запрашиваю документ после публикации страницы aspx, которая обслуживает эти файлы. Все последующие обращения возвращают пустую страницу (даже из новых вкладок или окон браузера). Firefox всегда надежно отображает PDF-файл.

Попытки решения

Я пробовал различные способы потоковой передачи файла:

Response.TransmitFile(sPath);
Response.WriteFile(sPath);
//As well as some others

Я пробовал добавить .pdf к параметру в конце запроса

http://www.myurl.aspx?File=test.pdf

Я пробовал сделать URL-адрес уникальным, добавив отметку времени

http://www.myurl.aspx?File=test.pdf&Unique=Friday__September_17__2010_12_02_16_PM

Не предпринималось

Я читал о том, что сжатие IIS вызывает проблемы, но это было для более новой версии IIS.

Не пробовал использовать тег embed, так как хотел бы по возможности придерживаться iFrame (его использует существующая инфраструктура).

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

Спасибо.


person Brandon Boone    schedule 17.09.2010    source источник


Ответы (4)


У меня была аналогичная проблема, которая возникла, когда PDF-файлы передавались через SSL (только IE, FF не выявлял проблему), которая была решена только следующим образом:

Response.ClearHeaders();
Response.ClearContent();
Response.Buffer = true;

Response.AppendHeader("Content-Disposition", "inline; attachment; filename=Filename.pdf");
Response.ContentType = "application/pdf";

Response.WriteFile(path);

Response.Flush();
Response.End();
person Forgotten Semicolon    schedule 17.09.2010
comment
Спасибо, но теперь я получаю такое же поведение, за исключением того, что файл загружается и открывается в собственном приложении. Это все еще работает только в первый раз после того, как я опубликую свой сайт. - person Brandon Boone; 17.09.2010

Поэтому я сдался и решил использовать вместо этого стандартное всплывающее окно IE.

window.open(URL, 'Window', 'height=' + pageHeight + ',width=' + pageWidth + ',top=0,left=0,resizable');

Мне пришлось отобразить PDF-файлы в теге объекта и все остальное внутри iframe во всплывающем окне, чтобы он работал, но он работает ...

if (sDocType == "pdf")
{
    Response.AddHeader("content-type", "text/html");
    WebClient client = new WebClient();
    Response.Write("<html style='margin:0px;padding:0px;'><head></head><body style='margin:0px;padding:0px;'><object height='100%' width='100%' name='plugin' data='" + Request.Url.ToString() + "&embed=true' type='" + zGetContentType(HttpContext.Current.Request.QueryString["docType"]) + "'><param name='src' value='" + Request.Url.ToString() + "&embed=true' />alt : <a href='" + Request.Url.ToString() + "&embed=true'>View</a></object></body></html>");
    Response.Flush();
    Response.Close();
    Response.End();
}
else
{
    Response.AddHeader("content-type", "text/html");
    WebClient client = new WebClient();
    Response.Write("<html style='margin:0px;padding:0px;'><head></head><body style='margin:0px;padding:0px;'><iframe frameborder='0' scrolling='no' height='100%' width='100%' src='" + Request.Url.ToString() + "&embed=true' /></body></html>");
    Response.Flush();
    Response.Close();
    Response.End();
}
person Brandon Boone    schedule 20.09.2010

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

Response.Clear();
Response.ContentType = "application/pdf";
Response.BinaryWrite(pdfBuffer);
Response.Flush();

В противном случае существует вероятность того, что что-то попало в настройки реестра для application/pdf CLSID на клиентском компьютере.

person AJ.    schedule 17.09.2010
comment
Спасибо @AJ, я пробовал, но получаю тот же результат. Я думаю, что проблема скорее в проблемах с кешированием (см. Мою правку выше). - person Brandon Boone; 17.09.2010