为什么Response.Redirect有时会从缓存中拉出来?

时间:2010-01-18 19:55:36

标签: c# asp.net vb.net iis caching

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

我没有在这里使用输出缓存或任何特殊的东西 - 这是一个CRM,缓存要么在客户端发生,要么更有可能在IIS中自动发生。

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

我做了一点挖掘,有些人通过使用Server.Transfer(其实际行为与Response.Redirect不同,并且一些细节并不总是可取的)来解决这个问题,并且其他一些人说要设置Response.Cache我想避免缓存的页面上的.SetCacheability(HttpCacheability.NoCache)。

我希望更好地了解这里发生的事情,并且可能是一种最佳实践 - 一方面,我认为.aspx页面总是被标记为避免缓存。正确?

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

默认情况下,不会发送任何用于控制缓存的标头。这使客户端可以自行制定有关如何缓存发送内容的规则。

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

Response.Cache.SetCacheability(HttpCacheability.NoCache) 

确保请求(重定向或其他方式)不仅仅使用缓存版本。

答案 1 :(得分:5)

Response.Redirect向浏览器发送一个响应,告诉它所请求的对象已移动并向其提供新位置。在这种情况下,如果您重定向到“redirect.aspx”,如果浏览器在缓存中有该项,则只要符合可达性标准,它就会从那里显示。

你提到Response.Transfer,但你的意思是Server.Transfer。这是将执行上下文传输到新页面的服务器端机制。因此,用户在您的应用中请求“main.aspx”。在该页面中,您将Server.Transfer转移到“transferred.aspx”。在服务器端,它是相同的请求,因此当呈现输出时,客户端的浏览器将显示URL“main.aspx”,而不是“transferred.aspx”。

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

是的,如果您希望页面始终调用服务器,则需要设置可达性。默认情况下,aspx没有特殊的浏览器行为,因为它只发送html。您可以设置:

例如,Response.Expires = -1。