2013-03-21 49 views
0

我決定實施緩存以提高產品頁面的性能。如何使用Razor動態查詢和WebCache緩存多個頁面版本

每一頁都包含大量的產品圖片。

我在Razor視圖中創建了以下代碼。

@{ 
var productID = UrlData[0].AsInt(); 
var cacheItemKey = "products"; 
var cacheHit = true; 
var data = WebCache.Get(cacheItemKey); 

var db = Database.Open("adldb"); 
if (data == null) { 
cacheHit = false; 
} 
if (cacheHit == false) { 
data = db.Query("SELECT * FROM Products WHERE ProductID = @0", productID).ToList(); 
WebCache.Set(cacheItemKey, data, 1, false); 
} 
} 

我使用的數據用下面的代碼:

@foreach (dynamic p in data) 
{ 
<a href="~/Products/View/@p.ProductID" 
<img src="~/Thumbnail/@p.ProductID"></a> 
} 

緩存代碼工作得很好,但通過新的查詢字符串參數時(改變頁面的版本)的結果瀏覽器與宣佈的兌現時間相同。

如何緩存每個版本的頁面?

感謝

奧列格

回答

0

一個非常簡單的方法可能是將密鑰(productID)轉換成字符串和其附加到你的cacheItemKey的名稱。

所以,你可能會考慮更改線路:

var cacheItemKey = "products"; 

閱讀:

var cacheItemKey = "products" + productID.ToString(); 

這將產生你正在尋找的行爲 - 基本上模仿VaryByParam設置。

ps。請記住,我沒有添加任何防禦性代碼,您應該這樣做

希望有幫助。

+0

謝謝大衛,那樣做!但是什麼意思是「添加任何防禦性代碼」?我不熟悉這一點。 – user879356 2013-03-26 15:05:19

+0

我正在考慮在調用'ToString()'之前可能在'productID'上測試'NULL',但我認爲如果數據出現問題,它可能會在示例代碼中的AsInt()失敗。 「防衛性代碼」我只是想添加代碼來測試通常與數據類型相關的假設。 下面是維基百科關於防禦性編程的條目的鏈接,該鏈接說得比我的要好得多。 http://en.wikipedia.org/wiki/Defensive_programming – 2013-03-26 18:28:40

+0

如果您將我的答案標記爲已接受的答案,我將不勝感激。祝你有美好的一天。 – 2013-03-26 18:30:49

相關問題