2011-08-15 109 views
4

我有一個ASP.Net網站在回傳到初始頁面之後流回PDF文檔。在IE,Chrome,Firefox以及iPhone和iPad上,一切正常,PDF發送到瀏覽器。在Android手機上,我收到錯誤消息,指出PDF無效。下面的代碼是我試圖做的簡化版本,但它確實重現了錯誤。我基本上有一個設置在服務器上運行的網頁上的按鈕。在頁面的第一個請求時,它會顯示HTML和按鈕點擊之後,它應該呈現的PDF:Android手機未在ASP.Net網站發佈回傳後流式傳輸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瀏覽器的某種緩存問題。 謝謝。

回答

1

嘗試傳送當前請求到其他處理程序,您將PDF直接呈現給響應流。

網頁代碼:

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

而在這新RenderPDF.ashx,搬到這裏來負責渲染PDF文件的代碼。

+0

謝謝。我會給這個鏡頭,讓你知道。 –

0

Android似乎不喜歡Content-Disposition很多,從我可以告訴。我建議將PDF文件寫入文件併發送重定向到指向該文件的URL。

+0

這對我來說並不是一個好的解決方案,因爲在我真正的解決方案中,我是從數據庫流式傳輸數據來創建PDF,而且我不希望在服務器上存在臨時副本。然後,我遇到了很多清理文件和確保名稱唯一性的問題。另外,如果我不做回發,這似乎不是問題,我已經發現並將添加到原始帖子。 –

+0

@John Koerner:「我不希望在服務器上安裝臨時文件」 - 將其粘貼在特定的目錄中,並使用「cron」作業每晚清理較舊的PDF文件。 「並確保名稱的唯一性」 - 使用GUID。 – CommonsWare

+0

問題是,我根據用戶的輸入解密了一些數據,並且我無法將解密的數據在服務器的文件系統上保存任何時間段。 –