Android-телефоны не открывают PDF-поток после обратной передачи на сайте ASP.Net

У меня есть сайт 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. Благодарю.

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

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

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

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

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