2016-12-30 49 views
1

我們正在使用Couchbase作爲我們的Session和OutputCache。OutputCache因使用來自會話的ModelBinder傳遞的複雜對象屬性而異

在這種情況下,我們如何通過使用自定義模型綁定器傳遞給方法的複雜對象進行緩存,從而從Session中檢索值?

這是我想與OutputCache屬性緩存方法的簽名:

[HttpGet] 
[OutputCache(CacheProfile = "MyObjectsCache", VaryByParam = "myParam")] 
public ActionResult Index([ModelBinder(typeof (CustomVariableSessionModelBinder<MyClass>))] MyClass myParam) 
{ 

注:ModelBinder的正在這裏用來超越我的原因,我不能改變它。

MyClass是一個具有Id的複雜對象。我想使用Id作爲緩存標識符。

public class MyClass 
{ 
    public int Id{get;set;} 
    //Other Properties 

這是怎樣的對象正在從會話檢索:

var sessionKey = typeof (MyNamespace.MyClass).FullName; 
var httpContext = HttpContext.Current; 
MyNamespace.MyClass newObject = null; 

if (httpContext.Session != null) 
{ 
    newObject = httpContext.Session[sessionKey] as MyNamespace.MyClass; 
} 

是否有可能喲這種情況下使用VaryByParam否則我將不得不使用VaryByCustom

回答

0

我還沒有測試過這個,但它應該的工作。無論如何,這幾乎是你唯一的選擇。

除了內置的方法變化之外,您可以根據「自定義」進行變化。這將調用Global.asax中的方法,您需要覆蓋該方法:GetVaryByCustomString。重要的是對於你的情況,這個方法通過HttpContext,所以你應該能夠看看會話。從本質上講,該解決方案將是這個樣子:

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    var args = custom.ToLower().Split(';'); 
    var sb = new StringBuilder(); 

    foreach (var arg in args) 
    { 
     switch (arg) 
     { 
      case "session": 
       var obj = // get your object from session 
       // now create some unique string to append 
       sb.AppendFormat("Session{0}", obj.Id); 
     } 
    } 

    return sb.ToString(); 
} 

這是專門用來處理多種不同類型的「定製」有所不同的類型。例如,如果您想通過常見的「用戶」進行更改,則只需在交換機中添加該用戶即可。重要的部分是由這個方法返回的字符串實際上是輸出緩存的變化,所以你希望這種情況是唯一的。這就是爲什麼我在這裏將對象的id與「Session」相加的原因。例如,如果您剛剛添加了ID,比如說123,然後在另一種情況下,您根據用戶進行了更改,該字符串僅由用戶的ID組成,該ID恰好也是123。這將是輸出緩存的相同字符串,並且會以一些奇怪的結果結束。只要注意自定義字符串的樣子。

現在,你只是改變你的OutputCache屬性,如:

[OutputCache(CacheProfile = "MyObjectsCache", VaryByParam = "myParam", VaryByCustom = "Session")] 

注:由多個自定義的東西一下子改變,你將它們與;分離(基於如何上面的代碼作品)。例如:VaryByCustom = "Session;User"

相關問題