2010-02-23 101 views
1

我有一個ASP.net應用程序,它返回一個二進制PDF文件(從數據庫中存儲,以前上傳)到客戶端。如何在IE6中顯示PDF附件

我的代碼對所有瀏覽器都很好,除了Internet Explorer 6(我的生活故事!)。在IE6中,當用戶點擊打開時,Adobe報告錯誤:「打開此文檔時出錯,無法找到該文件。」

當用戶點擊保存時,PDF保存正常,可以通過雙擊打開。我很難過。 Google已經給出了緩存建議(將cachecontrol設置爲私有等),並且我嘗試了所有這些,但都沒有成功。

這個奇怪的行爲是,當我從頭開始在ASP.net服務器層(使用NFop)生成PDF時,IE會打開它(使用相同的代碼!)。

這裏是我的整個網絡發送的二進制數據代碼:

// Firefox doesn't like spaces in filenames. 
    filename = filename.Replace(" ", "_"); 

    string extension = Path.GetExtension(filename); 

    string contentType; 

    switch (extension) 
    { 
     case "pdf": 
      contentType = "application/pdf"; 
      break; 
     default: 
      contentType = "application/x-unknown"; 
      break; 
    } 

    context.Response.Clear(); 
    context.Response.AddHeader("content-disposition", "attachment;filename=" + filename); 
    context.Response.Charset = ""; 
    context.Response.ContentType = contentType; 
    context.Response.BinaryWrite(data); 
    context.Response.Flush(); 

這裏是應用程序版本:

  • ASP .NET 3.5
  • IE6.0.2900.2180.xpsp_s
  • 列表項目
  • p2_gdr.091208-2028
  • Adob​​e Reader版本8.0.0
  • 的Windows XP SP 2
  • SQL Server 2008中

任何幫助/建議將不勝感激。謝謝:)

編輯:

我已經插上提琴手查看頭果然它似乎是一個緩存的問題。哎呀!

當我的NFop PDF(工作的)被上傳時,它正在發送cache-control = private。 當我的附件PDF(不工作的)被上傳時,它發送no-cache。

我看過Response對象,當我調用context.Response.Flush()時,它們看起來都有相同的頭文件。

仍然難倒!

解決

某處在我們的框架是將其正在使用反射調用的流氓方法:

/// ///設置請求的expiratoin並迫使沒有緩存 /// 保護無效SetCacheExpiration(HttpContext上下文) { //設置緩存立即過期 context.Response.Cache.SetCacheability(HttpCacheability.NoCache); context.Response.Cache.SetSlidingExpiration(true); context.Response.Cache.SetExpires(DateTime.Now); context.Response.Cache。SetMaxAge(新的TimeSpan(0,0,0)); context.Response.Cache.SetNoStore(); context.Response.Cache.SetAllowResponseInBrowserHistory(false); context.Response.Cache.SetValidUntilExpires(false); context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);

} 

感謝您的幫助,緩存!有趣的是,實際上沒有緩存下載(打開時)的唯一瀏覽器是IE6。

+1

你應該調用'Path.GetExtension(fileName)'。 – SLaks 2010-02-23 22:42:53

+0

感謝您的提示! :) – Russell 2010-02-23 22:44:54

+0

請注意,'Path.GetExtension(fileName)'將包含'.'。 – SLaks 2010-02-23 22:58:01

回答

0

某處在我們的框架是其正在使用反射調用的方法流氓:

/// <summary> 
    /// Sets the expiratoin of the request and force no cache 
    /// </summary> 
    protected void SetCacheExpiration(HttpContext context) 
    { 
     //sets the cache to expire immediately 
     context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     context.Response.Cache.SetSlidingExpiration(true); 
     context.Response.Cache.SetExpires(DateTime.Now); 
     context.Response.Cache.SetMaxAge(new TimeSpan(0, 0, 0)); 
     context.Response.Cache.SetNoStore(); 
     context.Response.Cache.SetAllowResponseInBrowserHistory(false); 
     context.Response.Cache.SetValidUntilExpires(false); 
     context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 

    } 

感謝您的幫助,緩存!有趣的是,實際上沒有緩存下載(打開時)的唯一瀏覽器是IE6。