我有一個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
- Adobe 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。
你應該調用'Path.GetExtension(fileName)'。 – SLaks 2010-02-23 22:42:53
感謝您的提示! :) – Russell 2010-02-23 22:44:54
請注意,'Path.GetExtension(fileName)'將包含'.'。 – SLaks 2010-02-23 22:58:01