IE8에서 캐시 된 데이터를 반환하는 $ .getJSON


102

현재 ASP.net MVC 및 JQuery를 사용하고 있습니다. 말이되지 않는 행동을 발견했습니다.

$.getJSON일부 div를 채우기 위해 JQuery의 함수를 호출하고 있습니다. 이벤트는 이벤트에서 트리거됩니다 $(document).ready. 이것은 완벽하게 작동합니다.

AJAX.BeginFormdiv를 채울 때 사용할 다른 값을 추가 하는 작은 값이 있습니다. 원격 함수를 올바르게 호출하고 성공하면 원래 javascript 함수를 호출하여 div를 다시 채 웁니다.

이상한 부분은 다음과 같습니다. FireFox 및 Chrome에서-모든 것이 작동합니다. 하지만 IE8 (베타)에서는 ($ .getJSON 함수를 호출하는) 채우기 Div 스크립트에 대한이 두 번째 호출이 캐시 된 데이터를 가져오고 서버에 묻지 않습니다!

이 질문이 이해되기를 바랍니다. 간단히 말해서- $.getJSON캐시 된 데이터를 가져 오는 이유는 무엇 입니까? 그리고 IE8에만 영향을 미치는 이유는 무엇입니까?


이상하게도이 버그는 IE뿐만 아니라 Firefox에서도 보입니다. jquery에서 ajax 캐싱을 비활성화하면 도움이되었습니다.
Josef Sábl

답변:


67

알려 드리기 위해 Firefox와 Chrome은 모든 Ajax 요청을 케이블이 아닌 것으로 간주합니다. IE (모든 버전)는 Ajax 호출을 다른 웹 요청처럼 처리합니다. 이것이 바로이 동작을 보는 이유입니다.
IE가 각 요청에서 데이터를 다운로드하도록하는 방법 :

  • 말했듯이 JQuery에서 'cache'또는 'nocache'옵션을 사용하십시오.
  • 요청에 임의의 매개 변수를 추가하십시오 (추악하지만 작동합니다 :))
  • 서버 측에서 캐서 빌리티를 설정합니다 (예 : 속성 사용, 아래 참조).

암호:

public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}

1
이 솔루션은 저에게 호소력이 있습니다. 나는 MVC에서 attibute를 적용하는 우아함을 정말 좋아합니다
Andrew Harry

1
요즘에는 OutputCacheAttribute OOTB가 있습니다.
bzlm

1
@bzlm하지만 검색하기 더 쉽습니다
Simon_Weaver

클라이언트 측 솔루션을 위해 formatinternet.wordpress.com/2010/01/14/… 를 확인하십시오.
Ivo

1
사실, :) 그것은 주변의 다른 방법은,하지만 난 개발자 IE로 동의 인내심을 필요로
니코

107

이것이 나를 위해 일한 방법입니다 ...

$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
     // do stuff with callback data
     $.ajaxSetup({ cache: true });
   });

나는이 문제로 고심하고 있었고 당신의 해결책은 그것을 해결하는 빠른 방법을 제공했습니다. :) 질문이 있습니다. $ .ajaxSetup에 어떤 옵션을 사용할 수 있는지 알고 있습니까? jQuery를 문서는 ... 불행하게도 세부 사항을 제공하지 않습니다
Achimnol

1
사용 가능한 옵션은 $ .ajax와 동일합니다. 자세한 내용은 docs.jquery.com/Ajax/jQuery.ajax#options 를 참조하십시오
Dan Esparza

12
위의 코드에 대한 약간의 경고-경쟁 조건이 포함되어 있습니다. 호출과 응답이 비동기 적이기 때문에 콜백이 아닌 $.ajaxSetup({ cache: true });직후에 호출해야합니다 getJSON().
색소폰

16

답변 해 주셔서 감사합니다. $ .ajax ( '{cache : no}'); 사용 완벽하게 작동했습니다. [편집하다]

아니면 적어도 내가 그렇게 생각했다. jquery $ .getJSON이 $ .ajax 객체에 대한 변경 사항을 읽지 않는 것 같습니다.

결국 작동하게 된 솔루션은 새 매개 변수를 수동으로 추가하는 것이 었습니다.

var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);

날짜 해상도는 분 단위입니다. 이는이 솔루션이 최대 1 분 동안 여전히 캐시된다는 것을 의미합니다. 이것은 내 목적에 적합합니다.


9
var noCache = new Date (). getTime (); // ms에 당신을 줄 것입니다
scunliffe

감사합니다 Scunliffe! -저는 자바 스크립트에 익숙하지 않습니다. ASP MVC가 저에게 새로운 지평을 열었습니다.
Andrew Harry

Math.Random ()과 같은 것을 시도 할 수도 있습니다.
Falkayn

@Falkayn-터프를 Math.Random()사용할 수 있으며 그 결과를 알 수 없으며 동일한 숫자를 연속으로 두 번 (또는 그 이상) 얻을 수 있습니다. 사용 new Date().getTime()하면 반복되지 않습니다. (시간을 거슬러 올라갈 수 없다면;))
Dementic

11

Controller의 Action에 다음 속성을 배치하여 동일한 문제를 해결했습니다.

[OutputCache(Duration = 0, VaryByParam = "None")]

훌륭한! 대안이 있으면 좋습니다 (이것을 선택했습니다). 모든 기여자에게 감사드립니다!
Anders Juul

Asp.Net MVC 4.0에서 잘 작동합니다
Mayank 2016 년

4

ASP.net MVC를 사용하는 경우 다음과 같이 캐싱을 쉽게 구현하지 않도록 확장 메서드를 추가하는 것이 좋습니다.

    public static void NoCache(this HttpResponse Response)
    {
        Response.Cache.SetNoStore();
        Response.Cache.SetExpires(DateTime.MinValue);
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetValidUntilExpires(false);

        Response.Expires = -1;
        Response.ExpiresAbsolute = DateTime.MinValue;
        Response.AddHeader("Cache-Control", "no-cache");
        Response.AddHeader("Pragma", "no-cache");
    }

좋은 생각입니다. 콜백 중에 서버에서이 확장 메서드를 호출하는 것입니까?
Guy

2

캐시 브레이커를 보내야 할 수도 있습니다.

경우에 대비해 $ .ajax ({cache : no}) 사용하는 것이 좋습니다 (get 요청에 임의의 접미사 추가).

(저는 요즘 어디서나 $ .ajax를 사용하는 경향이 있습니다.


답변 해 주셔서 감사합니다! ... 아직 시도하지 않았습니다. 곧 피드백을 제공합니다
Andrew Harry

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.