2012-11-29 4 views
2

코드에서 출력 캐싱을 취소 할 수 있는지 알고있는 사람이 있습니까? 나가 말하고 싶은 것은 내가 자식 동작에 출력 캐싱을 배치하면 다음과 같이 자식 동작 내부에서 캐싱을 취소 할 수있는 조건을 기반으로 할 수 있는가? 난 당신이있을 거라 생각 :ChildAction에서 출력 캐싱을 취소하십시오.

// Only cache output if this wasn't an error 
if (!wasException) { 
    ChildActionCacheInternal.Add(uniqueId, capturedText, 
           DateTimeOffset.UtcNow.AddSeconds(Duration)); 
} 

나는이 문제를 해결하는 훌륭한 방법을 볼 수 없습니다 : 그것은 유일한 논리처럼 보이는

[ChildActionOnly] 
[OutputCache(Duration = 36000, VaryByParam="tagslug")] 
public virtual ActionResult MostViewed(string tagslug, int count) 
{ 
    // Make an API call here. If not data returned do not cache the ChildAction as specified above 
} 

답변

1

스키밍 the framework source는 본건 캐시 - 온 - 예외 CodeBrowser에서 ASP.NET MVC 소스의 원본 소스를 기반으로 자신의 사용자 지정 OutputCachingAttribute을 만들어야합니다. 그런 다음 출력에 대한 해당 줄에 추가 검사를 추가하십시오.

if (!(wasException || capturedText.Contains("results:0"))) { 

또는 유사하거나 컨트롤러에서이 코드에 플래그를 전달할 수있는 방법을 찾으십시오. 기존 코드는 객체를 사용하여 세션에 값을 저장합니다. 이것을 복사 할 수 있습니다 (예 :

  1. _childActionFilterFinishCallbackKey과 같은 새 정적 객체 키를 정의하십시오. _noCacheResultKey
  2. 예 : 전화 할 수있는 속성에 public static 메소드를 추가합니다.

    public static void FlagNoCache(HttpContext httpContext) { 
        httpContext.Items[_noCacheResultKey] = true; 
    } 
    
  3. 이 너무 예컨대 확인 상기 시험 연장 콜백뿐만 아니라 .Items[]에서 이것을 제거 ClearChildActionFilterFinishCallback 확장 컨트롤러 호출 필요 MyOutputCacheAttribute.FlagNoCache(Context);에서

    if (!(wasException 
         || filterContext.HttpContext.Items.ContainsKey(_noCacheResultKey))) { 
    
  4. .

또한 당신의 코드에서 예외가 발생하고는 OutputCacheAttribute 이상까지 전달되지 않습니다하지만 어떻게 미안 내가 아는하지 않도록 다른 IExceptionFilter에 잡을 수있을 수 있습니다.

관련 문제