2010-02-25 6 views
0

나는 이상하게 캐싱을 처리하는 것 같은 간단한 개념 증명을했습니다.ASP.NET MVC에서 AJAX 캐싱 디버깅

<script>  
$('#clickToLoad').click(function() { 
    $.ajax({ 
     url: "<%=ResolveUrl("~/Home/AjaxCacheTest") %>?" 
     , dataType: 'json' 
      ,ifModified: true 
      ,cache: true 
     ,success: function(sourceData) { 
     } 
    }); 
}); 
</script> 

이이 컨트롤러에서 작업에 링크 : 다음은 뷰의

[OutputCache(VaryByParam = "none", Duration = 3000)] 
public ContentResult AjaxCacheTest() 
{ 
    return Content("0", "application/json"); 
} 
내가 캐싱 결과를 좀하고 싶습니다

그러나, AjaxCacheTest하지 않는 한 캐시하지 않는 것 같다 나는 AJAX 대신 브라우저 창에서 직접 요청한다.

캐시 설정 : 참으로 도움이되지 않습니다. ifModified : true를 설정하면 캐싱이 발생하지만 success 함수가 호출되지 않으므로 결과를 사용할 수 없습니다.

캐싱을 허용하고 응답 콜백을 계속 호출 할 수있는 옵션이 있습니까?

업데이트 : 감사합니다. 추가하지 않았습니다. 방화 광구를 테스트하고 응답 코드 (200 OK vs 302)와 요청의 응답 시간을 비교하여 캐싱이 처리되는 방식을 결정합니다. 이것은 모두 Visual Studio에 내장 된 서버 (Cassini?)에 있습니다.

+2

무엇을 테스트합니까? IIS? 카시니? 당신은 디버그 모드에 있습니까? (web.config의 설정을 의미합니까?) FireBug 또는 비슷한 도구를 통해 reqeust 및 응답 헤더를 확인 했습니까? 질문에 대한 답변을 추가하십시오. –

답변

2

시나리오의 캐싱이 작동하는 방식은 다음과 같습니다. 다음과 같은 행동을 정의한다고 가정

[OutputCache(VaryByParam = "none", Duration = 5)] 
public ActionResult AjaxCache() 
{ 
    return Json(new { date = DateTime.Now }, JsonRequestBehavior.AllowGet); 
} 

당신은 명시 적으로 의미 OutputCacheLocation.Any에 기본 속성 Location을 설정하지 않은 경우 :

출력 캐시는 브라우저 클라이언트에 위치 할 수 있습니다 (여기서 요청), 요청에 참여하는 프록시 서버 (또는 다른 서버) 또는 요청이 처리 된 서버에서. 이 값은 이며 HttpCacheability에 해당합니다. 공용 열거 형 값에 해당합니다.

Duration = 5은 콘텐츠가 5 초 동안 캐시된다는 것을 의미합니다. 다음으로 아약스 요청을 보내

<%= Html.ActionLink("cache test", "AjaxCache") %> 

<script type="text/javascript"> 
$(function() { 
    $('a').click(function() { 
     $.ajax({ url: this.href, 
      success: function(json) { 
       $('#result').html(json.date); 
      } 
     });   
     return false; 
    }); 
}); 
</script> 

<div id="result"></div> 

을 5 초 간격 동안 두 배의 링크를 클릭하면 당신이 결과 DIV는 어느 쪽도 서버 동작이 명중되지 않습니다 변경되지 않습니다 볼 수 있지만 success 콜백이 항상 실행됩니다. 서버는 다음 헤더를 전송합니다.

Cache-Control: public, max-age=5 
Expires: Fri, 26 Feb 2010 14:09:02 GMT 
Last-Modified: Fri, 26 Feb 2010 14:08:57 GMT 
Vary: * 
+0

이 작업은 다소 효과가있는 것처럼 보입니다 ... MVC 2로 업그레이드해야했습니다. 아마도 MVC 2와 관련이 있습니다. 더 이상 304를 보내지 않고 단지 200 만입니다. 나는 더 많은 테스트를하고 나중에 알아낼 것이다. 고마워. – Chris

+0

이 MVC 2에서 작동합니다. MVC 1에서 무엇이 손상되었는지 알 수 없습니다. 경고 하나만; 적어도 제 경우에는 dataType : 'json'을 ajax 호출에 추가해야했습니다. 감사! – Chris

관련 문제