2016-12-30 1 views
1

Session 및 OutputCache에 Couchbase가 사용됩니다.세션에서 ModelBinder를 사용하여 전달 된 복합 개체 속성에 따라 달라지는 OutputCache

이 컨텍스트에서는 세션에서 값을 검색하는 사용자 지정 모델 바인더를 사용하여 메서드에 전달되는 복잡한 개체를 캐시 할 수 있습니까?

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

참고 :

내가 OutputCache 속성을 캐시 할 방법의 서명입니다 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로 구성되었으며 123 일 수 있습니다. 출력 캐쉬와 같은 문자열 일 것이므로 이상한 결과로 끝날 것입니다. 맞춤 문자열이 어떻게 생겼는지주의하십시오.

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

참고 :

이제

, 당신은 단지처럼 OutputCache 속성을 변경하는 것 한 번에 여러 사용자 정의 것들에 의해 다양하게, 당신이 ;으로 구분 것 (에 따라 어떻게 코드 위 공장). 예 : VaryByCustom = "Session;User"

관련 문제