2009-09-17 6 views
5

내 ASP.NET MVC 웹 사이트에서 OutputCaching을 사용하려고합니다. 문제는, 내가 querystring 매개 변수 중 하나의 값을 변경하려고하면 요청 된 첫 번째 항목에 대한 데이터를 반환합니다! 사용자 정의 속성 '키'라는 쿼리 문자열 PARAM 확인하고 메모리 사전에을 확인 - ApiAuthorize :내 ASP.NET MVC 웹 사이트에서 캐싱이 올바르게 작동하지 않습니까?

여기

[ApiAuthorize] 
[HandleErrorAsJson] 
public class SearchController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    [OutputCache(Duration = 60, VaryByParam = "*")] 
    public ActionResult ScoreCard(string foo, byte? bar, byte? pewpew) 
    { 
    .. 
    } 
} 
  • (변경된 PARAM 이름으로) 주 1 내 코드입니다 그것이 존재하는지 확인하십시오.
  • 참고 2 : HandleErrorAsJson - 예외가 발생하거나/throw 될 경우 오류 메시지를 json으로 반환하는 사용자 지정 특성입니다.

여기에 내가이 행동을 만들고있어 두 개의 샘플 호출입니다 : -

때문에 데이터를 GET = hello world, Pew Pew)가 200 OK로 반환됩니다. 두 번째 API 호출은 이전 호출의 데이터가 포함 된 200 OK를 반환합니다.

또한 프록시 서버를 사용하고 있지 않습니다. OutputCache 특성을 주석으로 처리하면 모두 좋다.

나는 또한 ..... (수동 내가 캐시에 필요할 때마다 목록) 다음과 같은 노력했습니다

[OutputCache(Duration = 60, VaryByParam = "foo,key,bar,pewpew")] 

없음 운 없습니다 :(내가 있는지 확인해야하는지

공지 사항 난 캐시 고유 키의 일부로 API 'Key'매개 변수를 포함하십시오. 사용자가 동일한 것을 검색하는 것을 원하지 않지만 두 번째 사용자가 올바른 키를 갖고 있지 않으면 캐싱 된 결과를 얻지 않아야합니다 ,하지만 오류 메시지 (기술적으로 401 승인되지는 않지만 어쨌든)는 ...

ghts?

답변

4

VaryByParam의 매개 변수 목록은 세미콜론으로 구분되며 쉼표로 구분되지 않습니다. 시도 해봐. 즉, * 작동 했어야했다.

+0

+1 직접 질문에 직접 초점을 맞 춥니 다. 나는 그가 여기에있는 유일한 문제라고 생각하지 않지만. 아래에 귀하의 의견에 대답했다. – dove

0

출력 캐싱을위한 필터를 사용하여 디버깅을 프로그래밍 방식으로 제어하고 필요할 때 설정할 수 있습니다. 여기를 설정하면 난 그냥 아주 정적 인 부분에 대해 지금까지 사용하고 나는 그것이 (또한 이전 캐싱이 해제되어 있는지 확인) 거라고 생각의 차이

public class CacheFilterAttribute : ActionFilterAttribute 
    { 
     private const int Second = 1; 
     private const int Minute = 60 * Second; 
     private const int Hour = 60 * Minute; 
     public const int SecondsInDay = Hour * 24; 


     /// <summary> 
     /// Gets or sets the cache duration in seconds. The default is 10 seconds. 
     /// </summary> 
     /// <value>The cache duration in seconds.</value> 
     public int Duration 
     { 
      get; 
      set; 
     } 

     public int DurationInDays 
     { 
      get { return Duration/SecondsInDay; } 
      set { Duration = value * SecondsInDay; } 
     } 

     public CacheFilterAttribute() 
     { 
      Duration = 10; 
     } 

     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      if (Duration <= 0) return; 

      HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
      TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration); 

      cache.SetCacheability(HttpCacheability.Public); 
      cache.SetExpires(DateTime.Now.Add(cacheDuration)); 
      cache.SetMaxAge(cacheDuration); 
      cache.AppendCacheExtension("must-revalidate, proxy-revalidate"); 
     } 
    } 

을한다면이를 사용하여 볼 수 주시기 바랍니다 사이트의, 그래서 제공 할 수 있습니다,이

[CacheFilter(DurationInDays = 1)] 

같은 전화가 분명히 그냥이 VaryByParams이 속성으로 노출하도록 연장하고 싶습니다 있지만 당신이 무엇을 해야할지 것 같은 소리.

+0

관심의 대상에서 왜 유감스럽게도 자신 만의 특성을 만들었습니까? –

+0

몇 가지 뷰에 적용하여 더 많은 작업을 수행 할 것입니다. 나는 위에서 보았던 정확한 설정에서 100 %가 아니었기 때문에 이것을 사용하여 쉽게 조정할 수 있었고 모든 곳에서 적용되었음을 알 수있었습니다.캐시를 설정할 때 더 많은 헤더를 추가할지 여부는 아직 결정되지 않았습니다. 물론 이것이 이것이 나쁜 생각이라면 나는 이것을 OutputCache 속성의 깔끔한 확장으로 만들 수 있고 아무 것도 잃을 수 없다. 즉, 위험이 발생하면 안전에 대한 명확한 길을 확보해야합니다. – dove

+0

그가 여기서 한 일에 아무런 문제가 없지만 당신의 질문에 답하지 않습니다. 그가 작성한 필터는 서버 캐싱이 아닌 * 브라우저 * 캐싱에 영향을줍니다. 그것은 합법적 인 일이며, ASP.NET MVC에 내장 된 것에 대해서는 전혀 알지 못합니다. 암시 적으로, 여기에는 두 개의 서로 다른 캐시, 브라우저의 캐시 및 서버의 캐시가 있습니다. 귀하의 질문은 나에게 Firebug 또는 Fiddler를 사용하여 이것을 다시 확인하는 것이 좋을지라도 서버 캐시와 관련된 것으로 보입니다. –

관련 문제