Android手机在ASP.Net网站回发后没有打开PDF流

时间:2011-08-15 12:58:07

标签: c# android asp.net pdf

我有一个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 个答案:

答案 0 :(得分:1)

尝试将当前请求转移到您将PDF直接呈现给响应流的其他处理程序。

您的网页代码:

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

在新的 RenderPDF.ashx 中,移动到负责渲染pdf文件的代码。

答案 1 :(得分:0)

从我能说的话来看,Android似乎不太喜欢Content-Disposition。我建议将PDF写入文件并发送重定向到指向该文件的URL。