代码之家  ›  专栏  ›  技术社区  ›  Brian MacKay

为什么响应重定向有时会从缓存中提取?

  •  5
  • Brian MacKay  · 技术社区  · 15 年前

    我注意到,当我响应.redirect到.aspx页面时,它有时会显示缓存页面,而不是实际执行页面并从数据库中提取新数据。

    我并没有在.NET中使用输出缓存或任何特殊的功能——这是一个CRM,缓存要么发生在客户机上,或者更可能在IIS中自动进行。

    顺便说一下,从来没有涉及到querystring。我正在通过会话传递密钥。我知道,如果我使用querystring,它可能会部分地绕过缓存问题,但在本例中它不是一个选项,无论如何,我真正想要的是更深入地了解正在发生的事情。

    我做了一点挖掘,有些人通过使用server.transfer(它的行为实际上与response.redirect不同,有些细节并不总是可取的),还有一些人说在我想要避免缓存的页面上设置response.cache.setcacheability(httpcacheability.nocache)。

    我想更好地了解这里发生的事情,可能还有一个最佳实践——首先,我想.aspx页面总是被标记以避免缓存。对吗?

    有什么想法吗?

    2 回复  |  直到 15 年前
        1
  •  6
  •   AnthonyWJones    15 年前

    默认情况下,不发送设计用于控制缓存的头。这样客户机就可以自行制定有关如何缓存发送的内容的规则。

    所以是的,你需要这样的东西:

    Response.Cache.SetCacheability(HttpCacheability.NoCache) 
    

    以确保请求(重定向或其他)不只是使用缓存版本。

        2
  •  5
  •   Mark Sherretta    15 年前

    response.redirect向浏览器发送一个响应,通知它请求的对象已移动,并为其提供新位置。在这种情况下,如果您重定向到“redirect.aspx”,如果浏览器在缓存中包含该项,则在满足可计算性标准的情况下,它将从缓存中显示该项。

    你提到了response.transfer,但你的意思是server.transfer。这是一种将执行上下文传输到新页面的服务器端机制。因此,用户在应用程序中请求“main.aspx”。在那个页面中,您server.transfer到“transferred.aspx”。在服务器端,它是相同的请求,所以当输出被呈现时,客户端的浏览器将显示一个“main.aspx”的URL,而不是“transferred.aspx”。

    总结-重定向=2个请求,传输=1个请求。希望有帮助。

    是的,如果您希望页面总是调用服务器,就需要设置cachability。默认情况下,ASPX没有特殊的浏览器行为,因为它只发送HTML。您可以设置:

    response.expires=例如-1。