Телефоны Android, не открывающие PDF, передаются после обратной передачи на сайте ASP.Net - PullRequest
4 голосов
/ 15 августа 2011

У меня есть сайт ASP.Net, который возвращает обратно документ PDF после обратной передачи на начальную страницу.В IE, Chrome, Firefox, а также на iPhone и iPad все работает отлично, PDF отправляется в браузер.На телефонах Android я получаю сообщение о том, что PDF является недействительным.Приведенный ниже код является упрощенной версией того, что я пытаюсь сделать, но он воспроизводит ошибку.У меня в основном есть кнопка на веб-странице, которая настроена для запуска на сервере.По первому запросу страницы он отображает HTML, а после нажатия кнопки должен отображать PDF:

protected void Page_Load(object sender, EventArgs e)
{

    Response.ClearHeaders();
    Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
    Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
    Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
    Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
    Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
    Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
    Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
    Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1 
    Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1 
    Response.AppendHeader("Expires", "0"); // HTTP 1.1 

    if (IsPostBack)
    {
        Response.ClearContent();
        Response.ClearHeaders();

        string fullPath = @"C:\Temp\outdoc.pdf";

        if (System.IO.File.Exists(fullPath))
        {

            //Set the appropriate ContentType.
            Response.ContentType = "application/pdf";
            //Response.ContentType = "application/octet-stream";
            Response.AddHeader("Content-Disposition", "attachment;filename=\"TestDoc.pdf\"");

            byte[] b = System.IO.File.ReadAllBytes(fullPath);
            this.Page.Response.AddHeader("Content-Length", b.Length.ToString());

            //Write the file directly to the HTTP content output stream.
            Response.BinaryWrite(b);
            Response.Flush();
            Response.End();
            Response.Close();

        }
    }


}

Я много играл с разными значениями в заголовках и разными способами закрытия и сбросапоток ответов без удачи.Кто-нибудь видел это раньше или кто-нибудь может предложить какие-либо предложения по поводу того, что можно попробовать.

Редактировать: Я обнаружил, что это происходит только тогда, когда я делаю обратную передачу на страницу.Если я просто передаю документ сразу, документ передается правильно.Это наводит меня на мысль, что это какая-то проблема с кэшированием в браузере Android.Спасибо.

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Попробуйте перенести текущий запрос в другой обработчик, где вы рендерите PDF напрямую в поток ответов.

Код вашей страницы:

if (IsPostBack)
{
  Context.Server.Transfer("RenderPDF.ashx");
  Response.End();
}

И в этом новом RenderPDF.ashx , переместите сюда этот код, отвечающий за рендеринг PDF-файла.

0 голосов
/ 15 августа 2011

Android, похоже, не очень нравится Content-Disposition, насколько я могу судить. Я рекомендую записать PDF-файл в файл и перенаправить URL-адрес, указывающий на этот файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...