背景我正在嘗試幫助同事調試過去6個月未曾出現的問題。在最近一次部署ASP.NET MVC 2應用程序之后,FileResult迫使用戶打開或保存PDF文件的響應在客戶端計算機上存在的時間已經很長,以至于PDF閱讀器無法打開它們。IE的早期版本(尤其是6)是唯一受影響的瀏覽器。Firefox和Chrome和較新版本的IE(> 8)的行為均符合預期??紤]到這一點,下一節將定義重新創建問題所需的操作。行為用戶單擊指向動作方法的鏈接(帶有href屬性的普通超鏈接)。action方法生成一個表示為字節流的PDF。該方法始終重新創建PDF。在操作方法中,設置了標頭以指示瀏覽器如何緩存響應。他們是:response.AddHeader("Cache-Control", "public, must-revalidate, post-check=0, pre-check=0");response.AddHeader("Pragma", "no-cache");response.AddHeader("Expires", "0");對于那些不熟悉標頭功能的人:一種。緩存控制:公共表示該響應可以被任何緩存所緩存,即使它通常是不可緩存的或僅可在非共享緩存中緩存的。b。緩存控制:必須重新驗證當在緩存接收到的響應中存在must-revalidate指令時,該緩存在過期之前將不能使用該條目以響應后續請求,而不必先通過原始服務器對其進行驗證,則該緩存不得使用該條目C。緩存控制:預檢查(與IE5一起引入)定義間隔(以秒為單位),在此間隔之后,必須檢查實體的新鮮度。在向用戶顯示資源之后,可能會進行檢查,但要確保在下一次往返中緩存的副本是最新的。d。緩存控制:后檢查(與IE5一起引入)定義一個間隔(以秒為單位),在此間隔之后,必須先檢查實體的新鮮度,然后才能向用戶顯示資源。e。語法:無緩存(以確保與HTTP / 1.0的向后兼容性)當請求消息中存在no-cache指令時,即使應用程序已緩存了所請求內容的副本,應用程序也應將請求轉發至原始服務器F。過期Expires實體標題字段提供了將日期/時間視為過期的日期/時間。我們從動作中返回文件return File(file, "mime/type", fileName);向用戶顯示一個“打開/保存”對話框單擊“保存”按預期工作,但是單擊“打開”將啟動PDF閱讀器,但是在閱讀器嘗試打開文件時,已存儲的IE臨時文件已被刪除,因此它抱怨文件丟失(并且它是)。這里有六個其他應用程序,它們使用相同的標頭將Excel,CSV,PDF,Word以及大量其他內容強加給用戶,因此從來沒有問題。問題標頭是否符合我們要執行的操作?我們希望文件臨時存在(被緩存),但始終將其替換為新版本,即使請求可能相同。在返回a之前,已在action方法中設置了響應頭FileResult。我已經請我的同事嘗試創建一個新類,該類繼承自,FileResult并改寫該ExecuteResult方法,以便它修改標頭,然后執行此操作base.ExecuteResult()-此狀態沒有狀態。我預感“ 0”的“ Expires”標頭是元兇。根據W3C的這篇文章,將其設置為“ 0”意味著“已經過期”。我確實希望它過期,我只是不希望IE在處理它的應用程序有機會打開它之前,先將其從文件系統中刪除。一如既往,謝謝!編輯:解決方案經過進一步測試(使用Fiddler檢查標頭),我們看到我們認為已設置的響應標頭不是瀏覽器正在解釋的標頭。我自己還不熟悉代碼,但是我沒有意識到一個潛在的問題:標頭被踩在action方法之外。盡管如此,我將保留這個問題。這樣做仍然很出色:Expires值為0vs. 的標頭之間似乎存在一些差異-1。如果有人可以通過設計聲稱與眾不同,就IE而言,我仍然想聽聽。不過,對于解決方案,上述標頭確實Expires可以-1在所有瀏覽器中使用設置為預期值的方式工作。更新1文章如何在所有瀏覽器中控制網頁緩存?詳細描述了可以通過設置Expires = 0來防止所有瀏覽器中的緩存。在此0vs -1參數上,我仍然不出售...
3 回答

梵蒂岡之花
TA貢獻1900條經驗 獲得超5個贊
對于IE,我記得必須設置Expires: -1。 如何防止Internet Explorer中的緩存似乎通過以下代碼片段進行了確認。
<% Response.CacheControl = "no-cache" %>
<% Response.AddHeader "Pragma", "no-cache" %>
<% Response.Expires = -1 %>
回顧代碼,這就是我發現的。另外,我隱約記得,如果設置Cache-Control: private為SSL,則可能無法正確運行。
Response.AddHeader("Cache-Control", "no-cache");
Response.AddHeader("Expires", "-1");
另外,所以,您不想緩存,是嗎?提及-1,但Response.Cache改為使用方法:
// Stop Caching in IE
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
// Stop Caching in Firefox
Response.Cache.SetNoStore();
但是,ASP Page緩存問題(IE8)表示此代碼無效。
- 3 回答
- 0 關注
- 617 瀏覽
添加回答
舉報
0/150
提交
取消