我有一个操作可以生成密码重置链接并将其通过电子邮件发送给用户

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] 属性(不在类或操作上)。

是什么导致 Web 服务器决定内容未更改并返回 HTTP 304?

我知道一个变通方法

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

我有兴趣了解 HTTP 304 响应的根本原因。

更新

第一个请求的标题:

请求头
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

注意:我在上面将 localhost 更改为 local 因为 StackOverflow 不允许发布包含 localhost 的链接:-)

浏览器为 Internet Explorer 10。

最佳答案

IE 默认缓存 ajax 响应,您需要通过将 ajax 对象的缓存属性设置为 false 来明确告诉它不要进行任何 ajax 缓存。

Chrome 等浏览器会自动将随机 token 附加到您的请求中,以使其独一无二。

关于asp.net-mvc - 为什么要缓存操作结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22850159/

10-16 16:28