Ajax 요청 결과 의 캐 시 문 제 를 어떻게 해결 하 는 지 설명 합 니 다.

기본적으로 IE 는 요청 주소 캐 시 Ajax 가 요청 한 결 과 를 대상 으로 합 니 다.다시 말 하면 캐 시가 만 료 되 기 전에 같은 주소 로 여러 개의 Ajax 요청 을 하면 처음으로 서버 에 실제로 전 송 됩 니 다.어떤 경우 에 이런 기본 캐 시 메커니즘 은 우리 가 원 하 는 것 이 아니다(예 를 들 어 실시 간 데 이 터 를 얻 는 것).이 글 은 이 문 제 를 간단하게 토론 하고 몇 가지 해결 방안 을 소개 한다.디 렉 터 리 1,문제 재현 2,URL 주소 에 접 두 사 를 추가 하 는 방식 으로 문제 해결 3,JQuery 의 Ajax 설정 을 통 해 문제 해결 4,맞 춤 형 응답 으로 문제 해결 1,문제 재현빈 ASP.NET MVC 응용 프로그램 에서 우 리 는 다음 과 같은 기본 적 인 HomeController 를 정 의 했 습 니 다.그 중에서 현재 시간 으로 돌아 가 는 Action 방법 GetCurrentTime 을 포함 합 니 다

 public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        public string GetCurrentTime()
        {
           return DateTime.Now.ToLongTimeString();
       }
   }
기본 Action 방법 Index 에 대응 하 는 View 정 의 는 다음 과 같다.우 리 는 5 초 마다 JQuery 의 방법 을 이용 하여 Ajax 방식 으로 GetCurrentTime 작업 을 호출 하고 돌아 오 는 결 과 를 표시 합 니 다

 <!DOCTYPE html>
    <html>
        <head>
            <title>@ViewBag.Title</title> 
            <script type="text/javascript" src="@Url.Coutent(“~/Scripts/jquery-1.7.1.min.js”)"></script>
            <script type="text/javascript">
                $(function () {
                    window.setInterval(function () {
                        $.ajax({
                           url:'@Url.Action("GetCurrentTime")',
                           success: function (result) {
                               $("ul").append("<li>" + result + "</li>");
                           }
                       });
                   }, 5000);
               });
           </script>
       </head>
       <body>
           <ul></ul>
       </body>
   </html>
서로 다른 브 라 우 저 로 프로그램 을 실행 하면 다음 그림 에서 보 듯 이 Chrome 브 라 우 저 에 서 는 실시 간 시간 을 표시 할 수 있 지만 IE 에 표 시 된 시간 은 모두 같 습 니 다

2.URL 주소 에 접 두 사 를 추가 하 는 방식 으로 문 제 를 해결 합 니 다.IE 가 Ajax 요청 에 대한 반환 결 과 는 요청 주소 에 따라 캐 시 되 기 때문에 이 캐 시 메커니즘 이 적용 되 기 를 원 하지 않 는 다 면 요청 할 때마다 요청 주소 에 다른 접 두 사 를 추가 하여 이 문 제 를 해결 할 수 있 습 니 다.이 예 에 대해 저 희 는 다음 코드 를 통 해 요청 주소 에 현재 시간 을 기반 으로 하 는 검색 문자열 을 추가 합 니 다.프로그램 을 다시 실행 하면 IE 는 실시 간 시간 을 표시 합 니 다

    <!DOCTYPE html>
    <html>
        <head>       
            <script type="text/javascript">
                $(function () {
                    window.setInterval(function () {
                        $.ajax({
                            url:'@Url.Action("GetCurrentTime")?'+ new Date().toTimeString() ,
                            success: function (result) {
                               $("ul").append("<li>" + result + "</li>");
                           }
                       });
                   }, 5000);
               });
           </script>
       </head>
   </html>
3.jQuery 의 Ajax 설정 을 통 해 문 제 를 해결 합 니 다.실제로 jQuery 는 이것 에 대한 Ajax 설정 을 가지 고 있 습 니 다.우 리 는 다음 과 같은 방식 으로$.ajaxsetup 방법 으로 Ajaz 의 캐 시 체 제 를 금지 해 야 합 니 다

 <!DOCTYPE html>
    <html>
        <head>       
            <script type="text/javascript">
                $(function () {
                    $.ajaxSetup({ cache: false });

                    window.setInterval(function () {
                        $.ajax({
                            url:'@Url.Action("GetCurrentTime")',
                           success: function (result) {
                               $("ul").append("<li>" + result + "</li>");
                           }
                       });
                   }, 5000);
               });
           </script>
       </head>
   </html>

실제로 jQuery 의 이 메커니즘 도 요청 주소 에 서로 다른 검색 문자열 접 두 사 를 추가 함으로써 이 루어 집 니 다.이것 은 Fiddler 차단 요청 을 통 해 확인 할 수 있 습 니 다.

4.맞 춤 형 응답 을 통 해 문 제 를 해결 할 수 있 습 니 다.저 희 는 요청 한 응답 을 통 해 결과 에 대한 캐 시 를 제어 할 수 있 습 니 다.이 를 위해 다음 과 같은 NoCacheAttribute 라 는 Action Filter 를 정의 합 니 다.현재 HttpResponse 의 SetCacheability 방법 을 사용 하여 캐 시 옵션 을 NoCache 로 설정 합 니 다.이 NoCacheAttribute 특성 이 GetCurrentTime 방법 에 적 용 된 후에 도 Google 프로그램 을 실행 하면 IE 에서 실시 간 으로 시간 을 얻 을 수 있 습 니 다

 public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [NoCache]

        public string GetCurrentTime()
       {
           return DateTime.Now.ToLongTimeString();
       }
   }
   public class NoCacheAttribute : FilterAttribute, IActionFilter
   {
       public void OnActionExecuted(ActionExecutedContext filterContext)
       {
         filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
       }

       public void OnActionExecuting(ActionExecutingContext filterContext)
       {}
   }
 

실제 NoCacheAttribute 특성 상 메시지 메 시 지 를 최종 제어 하 는 Cache-Control 헤더 로 설정 하고 결 과 를 캐 시 하지 않도록 브 라 우 저 에 지시 하 는'no-cache'로 설정 합 니 다.다음 과 같은 GetCurrentTime 요청 에 대한 응답 메시지 입 니 다

 HTTP/1.1 200 OK
    Server: ASP.NET Development Server/10.0.0.0
    Date: Thu, 03 Jan 2013 12:54:56 GMT
    X-AspNet-Version: 4.0.30319
    X-AspNetMvc-Version: 4.0
    Cache-Control: no-cache

    Pragma: no-cache
    Expires: -1
    Content-Type: text/html; charset=utf-8
   Content-Length: 10
   Connection: Close

   8:54:56 PM

자신의 마음 을 조용히 지 키 고 겉 만 번지르르 하 게 보다.

좋은 웹페이지 즐겨찾기