2013-07-19 2 views
12

나는 ASP.NET WebApi를 사용하고 모든 일에 캐싱을 중지하려면 다음 코드가 있어요 :크롬에서 WebApi의 REST 응답을 캐시하지 않으려면 어떻게해야합니까?

public override System.Threading.Tasks.Task<HttpResponseMessage> ExecuteAsync(System.Web.Http.Controllers.HttpControllerContext controllerContext, System.Threading.CancellationToken cancellationToken) 
{ 
    System.Threading.Tasks.Task<HttpResponseMessage> task = base.ExecuteAsync(controllerContext, cancellationToken); 
    task.GetAwaiter().OnCompleted(() => 
             { 
              task.Result.Headers.CacheControl = new CacheControlHeaderValue() 
              { 
               NoCache = true, 
               NoStore = true, 
               MaxAge = new TimeSpan(0), 
               MustRevalidate = true 
              }; 
              task.Result.Headers.Pragma.Add(new NameValueHeaderValue("no-cache")); 
              task.Result.Content.Headers.Expires = DateTimeOffset.MinValue; 
             }); 
    return task; 
} 

결과 헤더이 (크롬)과 같이 :

Cache-Control:no-store, must-revalidate, no-cache, max-age=0 
Content-Length:1891 
Content-Type:application/json; charset=utf-8 
Date:Fri, 19 Jul 2013 20:40:23 GMT 
Expires:Mon, 01 Jan 0001 00:00:00 GMT 
Pragma:no-cache 
Server:Microsoft-IIS/8.0 

내가 "아니 - 추가를 store "를 읽으십시오 ( How to stop chrome from caching).

Request Method:GET 
Status Code:200 OK (from cache) 

사람이 어떤이 있습니까 :이 페이지에서 멀리 저를 탐색 한 후 "뒤로"버튼을 사용하여 뭔가를 할 때

그러나, 아무리 내가 뭘, 크롬은 항상 캐시에서로드하지 왜 이런 일이 일어나고 있는거야? 서버가이 요청에 대해 절대 적중되지 않았 음을 확인했습니다.

답변

7

대답은 Chrome이 "Expires : Mon, 01 Jan 0001 00:00:00 GMT"(기본적으로 가짜 날짜)를 좋아하지 않는다는 것입니다.

나는 그들이 자신의 Google API에서 사용하는 어떤 것으로 내 날짜를 변경, 그것은 일 :

Cache-Control:no-store, must-revalidate, no-cache, max-age=0 
Content-Length:1897 
Content-Type:application/json; charset=utf-8 
Date:Fri, 19 Jul 2013 20:51:49 GMT 
Expires:Mon, 01 Jan 1990 00:00:00 GMT 
Pragma:no-cache 
Server:Microsoft-IIS/8.0 

그래서이 문제를 통해 오는 다른 사람을 위해, 당신이 당신이 임의의에 날짜를 만료 설정하기 날짜!

+0

no-store를 설정 한 경우 no-cache를 설정하지 말고, re-revalidate, max-age 및 만료는 no-store와 모순됩니다. No-store는 표현을 저장할 수없고 나머지 명령어는 저장된 표현을 관리하는 규칙을 설명한다는 의미입니다. –

+0

글쎄, no-cache를 무시하고 만료되는 Chrome 버그 때문에 저장소를 추가하지 않았습니다 (http://stackoverflow.com/questions/4146813/how-to-stop-chrome-from-caching 참조) ... so , 나는 네가 나에 대해 무엇을하기를 바라는 지 모르겠다. – automaton

+0

불행히도 no-cache는 캐시하지 않는다는 것을 의미하지 않습니다. 또한 Chrome에서 캐시 된 사본을 사용할 수 없다는 의미는 아닙니다. 단지 캐시 된 사본을 사용하기 전에 서버와 확인해야한다는 의미입니다. 서버가 올바른 정보를 반환하지 않으면 크롬은 캐시 된 결과를 기꺼이 반환합니다. –

관련 문제