2016-12-30 3 views
1

私たちはSessionとOutputCacheにCouchbaseを使用しています。セッションからModelBinderを使用して渡された複雑なオブジェクトプロパティによって変化するOutputCache

このコンテキストでは、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(CacheProfile = "MyObjectsCache", VaryByParam = "myParam", VaryByCustom = "Session")] 

注:今すぐ

、あなただけのようなあなたのOutputCache属性を変更したい、一度に複数のカスタム物事によって変化させるには、上記のどのコードに基づいて;(で区切りたいです作品)。例:VaryByCustom = "Session;User"

関連する問題