我有一个ASP.NET网站,它在初次请求页面后返回一个PDF文档。在IE、Chrome、Firefox以及iPhone和iPad上,一切正常,PDF被发送到浏览器。但是在安卓手机上,会出现“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();
}
}
}
我已经尝试了不同的标头值和关闭、刷新响应流的不同方法,但都没有成功。有人遇到过这种情况吗?或者能否提供一些尝试的建议。
编辑:我发现只有在页面进行 postback 时才会出现此问题。如果我直接流式传输文档,则文档会正确地流式传输。这让我觉得这可能是 Android 浏览器缓存问题。