2011-02-04 6 views
5

웹 사이트의 경우 인증되지 않은 사용자에 대해서만 페이지를 캐시하고 싶습니다. 인증 된 사용자는 캐싱 된 콘텐츠를 얻지 못합니다 (업데이트되고 결과를 올바르게 볼 필요가 있기 때문에). 떨어져). Link1 Link2인증되지 않은 사용자에 대해서만 콘텐츠 캐싱

을 ...하지만 인증 된 사용자에 대한 전체 캐싱을 해제하는 방법을 알아낼 수 없습니다 :

내가는 VaryByCustom를 사용하여 각 사용자에 대한 캐시를 변경하는 방법을 알고있다.

어떻게해야합니까?

편집

이미 인증되지 않은 사용자로부터 페이지의 캐시 된 버전이있는 경우 아래 코드는 문제가있다. 기본적으로 인증 된 사용자에게는 인증되지 않은 사물보기가 제공됩니다. (당신이 캐시 곳) Link

+0

는 사용자가 인증되어 있는지 확인하고 사용자 정의 캐시 속성을 만들 수있는 몇 가지 로직 (캐시 또는 캐시하지 출력)를 수행 한 후. –

+0

좋은 소리, 로빈슨. 사람들이 투표 할 수 있도록 대답으로 써야합니다. :) – Kjensen

답변

3

HttpCachePolicy.AddValidationCallback을 사용하십시오.

참조 : http://msdn.microsoft.com/en-us/library/system.web.httpcachepolicy.addvalidationcallback.aspx

+0

실제로, 모든 요청에 ​​대해 새 버전이 만들어집니다! 따라서 인증 된 사용자는 캐시 된 콘텐츠를 보지 않아야합니다. 하지만 또 다시, 당신은 캐시 오염이라는 새로운 문제가있을 수 있습니다.흠, 내가 이것에 대해 계속하자. 어쩌면 이걸로 null을 반환 할 수 있습니다. – Haacked

0

당신은 (당신이 캐시를하지 않는) 두 개의 컨트롤러, 인증 된 사용자에 대한 비 인증 된 사용자에 대한 하나를 만들 수 있습니다 :

그러나,이 링크는 여기에 작동하는 솔루션을 제공합니다 . 그런 다음 컨트롤러의 로직을 일반적인 "비즈니스 계층 객체"로 굴절시켜 코드 DRY 및 유닛 테스트 가능 상태를 유지할 수 있습니다. 에서 영감을 촬영

+0

그것은 그것을하는 방법이지만, 더 좋은 방법이 있어야합니다. – Kjensen

2

Link1 쉬운 코드 아이디어는 다음과 같이 당신이 GetVaryByCustomString 오버라이드의 출력을 변경할 수 있습니다 당신은 게시 : 기술적으로 인증으로

public override string GetVaryByCustomString(HttpContext context, string arg) 
{ 
    if (arg == "IsLoggedIn") 
    { 
     if (context.Request.Cookies["anon"] != null) 
     { 
      if (context.Request.Cookies["anon"].Value == "false") 
      { 
       return "auth"; 
      } 
     } 
     return Guid.New().ToString(); 
    } 
    else 
    { 
     return base.GetVaryByCustomString(context, arg); 
    } 
} 

이 정말 대답하지 않습니다 사용자의 출력은 여전히 ​​캐시되지만 인증 된 사용자가 결과가 무엇이든간에 즉시 볼 수 있도록하는 요구 사항을 충족시킵니다. 단점은 캐시 지속 시간/TTL을 충분히 작게 유지해야 캐시가 침수되지는 않지만 익명 사용자가 그로부터 충분한 이익을 얻을만큼 충분히 커야한다는 것입니다.

또 다른 대안은 캐싱을 수행하기 위해 사용자 고유의 조치 필터를 작성하고 거기에 익명 전용 캐싱에 대한 지원을 추가하는 것입니다. 이것은 '자신 만의'영역을 훨씬 더 많이 차지합니다. 시작 지점에 대해서는 Klopfenstein's old post 또는 Steve Sanderson's을 참조하십시오. OutputCache의 다른 많은 기능 (예를 들어 전체 경로 데이터를 키)은 부족하지만 사용자가 지정한 사양으로 작동하게 만들 수 있습니다.

5

글로벌 작업 필터로 사용하십시오.

public class NoCacheForAuthenticatedUsersAttribute: ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     if(filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     } 
    } 
} 
+1

나를 위해 작동하지 않는 것 같습니다. 페이지가 출력 캐시에 배치되면 속성 논리가 실행되지 않습니다. –

+0

아마도 유효성 검사 콜백이 누락되었을 수 있습니다. httpContext.Response.Cache.AddValidationCallback – qub1n

관련 문제