2

在我工作的公司ASP.NET MVC2瀏覽器緩存,我們有一個ASP.NET MVC2開發和IIS7託管的Web應用程序。與HTTP304狀態代碼

在一個特定的行動,我們返回一個JsonResult物體保持的陣列。此數組每天更新;所以任何來自同一天的請求都會以相同的響應結束。

public ActionResult SomeAction(int id) 
{ 
    // Some calculations 
    return Json(resultArray, JsonRequestBehavior.AllowGet); 
} 

由於操作成本高昂,我們希望通過瀏覽器緩存等提高性能。

我加了一個緩存頭,所以我們告訴用戶的瀏覽器緩存結果直到該數據庫的一次更新。

除此之外,我想添加一個「的Last-Modified」頭,所以瀏覽器會詢問如果電源是在指定日期之後修改。

完成這個的方法是什麼?我想檢查日期瀏覽器詢問(Last-Modified標題)後數據庫是否被修改,如果沒有修改,我想返回304只是IIS自動爲靜態文件(圖像,css和js文件等)做的

+0

[你知道輸出緩存的屬性吧?](http://msdn.microsoft.com/en-us/library/system.web.mvc.outputcacheattribute.aspx) – bzlm

+0

是的,但outputcache屬性需要編譯時間定義的持續時間,我需要在運行時檢查數據庫的最後修改日期。 – SadullahCeran

+0

沒錯。但是,你真正的問題是什麼?這聽起來像你有一切想通了。如果你設置了Expires和Last-Modified以及Cache-Control的東西,那麼不是所有東西都可以工作嗎? – bzlm

回答

3

添加真實的Last-Modified標題。如果你的數據每天更新,你應該知道什麼時候,對吧?

然後,在操作方法的開始處,通過解析HTTP請求中的該日期時間字符串並檢查數據的實際上次修改時間來檢查傳入的If-Modified-Since。如果數據沒有被修改,只需要return 304 manually。如果有的話,做一下行動方法通常會做的事情。

你也可以(或替代)與您的內容返回ETag,那麼它的值必須改變每當內容變化。

然後包裹了整個事情了作爲ASP.NET MVC Action Filter的可重用性。

然後post about it on your blog. :)

爲了防止行爲不端的客戶,誰不緩存任何客戶端(也許你的數據是由應用程序,而不是一個桌面瀏覽器加載),你可以存儲在操作方法的結果無論如何ASP.NET輸出緩存,以避免代價高昂的操作。你可能會用have to VaryByCustom來實現絕對期滿。

+0

感謝您的回答:)我首先通過您提供的鏈接訪問了58位,您是博客文章的作者嗎?我只是好奇。 – SadullahCeran

+0

沒有。它看起來與你需要的相似。 – bzlm