2015-11-23 19 views
1

未指定的VaryByParam參數時用作緩存字符串(鍵)的內容?未指定VaryByParam時ASP.NET MVC OutputCache如何工作

[OutputCache(Duration = 30)] 
public ActionResult Index(int customerId, Foo foo, Bar bar) 
{ 
    /* ... */ 
} 

我找不到上高速緩存時未指定VaryByParam(或VaryByCustom)是如何表現的任何文件。什麼被用作鑰匙?

通過做一些快速測試,在我看來,似乎所有的動作參數都用於緩存鍵。但是當的某些參數是對象(如這些foo,bar參數)時如何緩存工作?它使用他們的哈希碼嗎?或者它是否使用請求中的表單/查詢字符串變量?

我無法找到關於此主題的足夠文檔,但我認爲了解這些實現細節以避免將來的錯誤和對緩存機制的誤解是十分棘手的。

我主要對ASP.NET MVC第5版感興趣,但是如果有人知道關於OutputCache屬性的一些歷史記錄,我認爲這個信息也是非常有用的。

感謝您的回答或鏈接!

+0

下面是相關[源代碼(HTTPS ://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/OutputCacheAttribute.cs) - 請參閱GetChildActionUniqueId和GetUniqueIdFromActionParameters方法。如果我正確解釋這個請求,請求的所有參數都使用他們的名字 – Andrei

+0

@Andrei:謝謝。據我瞭解,有一些DescriptorUtil實際上採用'foo'對象,並以某種方式從中產生Id。我發現[源代碼](https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DescriptorUtil.cs),但我不知道它是如何產生從給定的對象的字符串ID ... –

+0

@Andrei:同樣,通過查看你發佈的源代碼,似乎沒有額外的設置指定,'OutputCache'屬性似乎使用'VaryByParam =「*」'( [第23行](https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/OutputCacheAttribute.cs#L23))。你也是這樣理解的嗎? –

回答

1

在我看來,OutputCacheAttribute在模型綁定之後起作用。 無論如何,我沒有找到它使用url的實際請求參數。

我發現當它構建ChildAction緩存鍵時,它使用Action方法參數代替。它將參數的值轉換爲字符串並且不對其進行序列化。 而當你使用類類型參數,它只是使用參數和類型的全名的名稱來構建鍵:

string partString = Convert.ToString(part, CultureInfo.InvariantCulture); 
builder.AppendFormat("[{0}]{1}", partString.Length, partString); 

解決方案?

  1. 將您需要的類的所有屬性作爲Action方法的參數來自url。
  2. 設置的VaryByParam =「PROP1; PROP2; ...」(我沒有測試這種情況下,不能確認這個工作,但它應該)
+0

作者遲了一點,但對於任何人問同一個問題 – vk5880

+0

感謝您的答案,我必須檢查出來。在我的情況下,解決方案實際上是使用VaryByCustom,我提供了一個字符串如何組成的自定義實現。我更喜歡完全控制這種行爲。 –