2014-04-03 3 views
4

나는이 작업에 내 중단 점을조치 결과가 캐시되는 이유는 무엇입니까?

public ActionResult SendResetPasswordEmail(string userName) 
{ 
    var webUser = LoadUser(userName); 
    if (webUser != null) 
    { 
     var token = WebSecurity.GeneratePasswordResetToken(webUser.UserName); 
     emailSender.SendPasswordResetEmail(webUser, token, resetAction); 
     return new HttpStatusCodeResult(HttpStatusCode.OK); 
    } 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "No user found with username: " + userName); 
} 

내가 브라우저에서 작업을 호출 처음, 내가 HTTP 200 응답을 사용자에게 암호 재설정 링크 및 이메일을 생성 (그리고 히트 액션).

브라우저에서 두 번째로 작업을 호출 할 때 콘텐츠가 변경되지 않았 음을 나타내는 HTTP 304 응답이 표시됩니다.

원본 파일에는 클래스 나 동작이 아닌 [OutputCache] 특성이 없습니다.

웹 서버가 내용을 변경하지 않고 HTTP 304를 반환하도록 결정하게하는 원인은 무엇입니까?

나는 내가 HTTP 304 응답에 대한 근본 원인을 이해하는데 관심이 작업 주위

https://stackoverflow.com/a/18620970/141172

알고 있어요. 첫 번째 요청에

업데이트

헤더 :

요청 헤더

Request GET /Companies/SendResetPasswordEmail/?userName=ej HTTP/1.1 
X-Requested-With XMLHttpRequest 
Accept */* 
Referer http://local:6797/Companies 
Accept-Language en-US 
Accept-Encoding gzip, deflate 
User-Agent Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0) 
Host localhost:6797 
DNT 1 
Connection Keep-Alive 
Cookie __RequestVerificationToken=sNOBS6qz32LtnJpLWgHHELhaE44DfIVE1LSMUgjzHjcwsvxlUFa4lOSyA5QeB8keLXYL08Psjg29CRI7W73uHLJy6A81; .ASPXAUTH=DAF8AF47E955F723EE9438866BE1B4BFBF91BA01912EF087824F03581DBCA05A4AECA01373FAF40DF0C4D5C17F17DEFA2F85C1B702988B7E0F750BFE19566FC711C7D6BD81D8F0B0ABD68AF5B3D9BA032286361F; ASP.NET_SessionId=5e2gcvkc2p3rji25z5emyqzd; HelixPlugins1.0=IEPlugin1.0 

응답 헤더

Response HTTP/1.1 200 OK 
Server ASP.NET Development Server/11.0.0.0 
Date Thu, 03 Apr 2014 23:29:02 GMT 
Cache-Control private, s-maxage=0 
Content-Length 0 
Connection Close 

참고 : StackOverflow의 로컬 호스트를 포함하는 링크가 인터넷 익스플로러는

브라우저 :-) 게시하는 것을 허용하지 않습니다 때문에 위의 지역에 로컬 호스트를 변경 (10)

+0

Fiddler를 사용하여 첫 번째 요청에서 서버가 캐싱을 허용하는 HTTP 헤더를 설정하고 있음을 확인할 수 있습니까? 그런 헤더가 없다면 다른 이론이 필요합니다. – usr

+0

@usr : 요청 및 응답 헤더를 게시했습니다. –

+0

아약스 전화입니까? –

답변

2

IE는 기본적으로 아약스 응답을 캐시, ajax 객체의 cache 속성을 false로 설정하여 아약스 캐싱을 수행하지 않도록 명시 적으로 지정해야합니다.

Chrome과 같은 브라우저는 요청에 임의의 토큰을 자동으로 추가하여 고유하게 만듭니다.

+0

그러나 [OutputCache (NoStore = true, Duration = 0, VaryByParam = "None")]'을 설정하면 브라우저 캐싱도 방지됩니다. MVC가 기본적으로 캐싱을 일으키는 원인이 무엇인지 이해하려고 시도하고 있는데, 이는 'OutputCacheAttribute'를 사용하여 재정의 할 수도 있습니다. 시간이 지남에 따라 많은 클라이언트가 작업을 소비 할 수 있으므로 클라이언트 개발자에게 부담을주고 싶지 않습니다. –

+0

당신은 OutputCache 속성에 Location = OutputCacheLocation.Server를 추가 할 수 있습니다. – Duy

+0

속성은 목록에있는대로 작동합니다. 정확히 어떤 동작이 변경되는지 (즉, * 기본 * 동작이 캐싱을 허용하는 이유와 HTTP 교환의 어떤 부분이 해당 캐싱을 허용하는지 이해하고 있음) 이해하려고합니다. –

관련 문제