【问题标题】:Why is action result cached?为什么要缓存动作结果?
【发布时间】:2014-05-16 00:30:19
【问题描述】:

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

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 更改为本地,因为 StackOverflow 不允许发布包含 localhost 的链接 :-)

浏览器是 Internet Explorer 10。

【问题讨论】:

  • 您能否使用 Fiddler 验证在第一个请求时服务器设置了允许缓存的 HTTP 标头?如果你找不到这样的标题,你需要一个不同的理论。
  • @usr:我发布了请求和响应标头。
  • @FelipeOriani:是的,这是一个 Ajax 调用。
  • 顺便说一句...这个调用可能应该是一个 POST 而不是一个 GET,因为您正在执行一个操作而不是请求资源。这样做会产生不缓存的副作用。
  • 好吧,我不知道这是否与您的问题有关,但是,当我们使用 jQuery 时,IE 中的 ajax 调用被缓存,其他浏览器也可以正常工作。我们所做的是设置$.ajaxSetup({ cache: false }); 和jQuery 进行的每个ajax 调用,在url 中添加一个带有随机数的_ 参数。它使所有请求都不同,我们让它在 IE 上运行。也许添加一个随机参数可以在 IE 中工作。

标签: asp.net-mvc asp.net-mvc-4 http asp.net-web-api


【解决方案1】:

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

Chrome 等浏览器会自动将随机令牌附加到您的请求中以使其唯一。

【讨论】:

  • 但是设置[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")] 也会阻止浏览器缓存。我试图了解 MVC 默认情况下正在做什么导致缓存发生,也可以通过使用 OutputCacheAttribute 覆盖。我不想将责任推给客户端开发人员,因为随着时间的推移,许多客户端可能会使用这些操作。
  • 您可以尝试将 Location=OutputCacheLocation.Server 添加到您的 OutputCache 属性中。
  • 该属性的作用与我列出的完全一样。我试图准确地理解它改变了什么行为(也就是说,理解为什么 default 行为是允许缓存的,以及 HTTP 交换的确切部分允许缓存)。
  • 这不是缓存问题。谁在处理条件请求并返回 304 是一个问题。当响应不包含任何验证器时,它如何处理条件请求。据我所知,这不符合 HTTP 规范。
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 2014-03-09
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多