РЕДАКТИРОВАТЬ 2
Кажется, что перемещение тега объекта в Dom является причиной проблемы.Я добавил iframe прямо на страницу, и он работает без проблем.
Однако, когда я перемещаю этот iFrame в модальное диалоговое окно (http://www.ericmmartin.com/projects/simplemodal/), PDF исчезает (тег объекта больше не отображается правильно).
Таким образом, кажется, что это неболее длинный вопрос о моем обработчике, но больше вопрос о том, почему перемещение тега «object» (или embed) в 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).
Если щелкнуть правой кнопкой мыши по фрейму и обновить страницу, объект загружается нормально.(То же самое верно, если я использую тег для встраивания).
Оригинальный вопрос
Я знаю, что по этому вопросу много вопросов ...
Но они либо не получили ответа, либо ответ не сработал.
Среда
- .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, если это возможно (существующая инфраструктура использует его).
Любая помощь будет принята с благодарностью !!!
Спасибо.