为什么 Response.Redirect 有时会从缓存中获取?

5
我注意到当我使用Response.Redirect跳转到一个.aspx页面时,有时会显示缓存页面而不是实际执行页面并从数据库中提取新数据。
在这里,我没有使用输出缓存或任何特殊的.NET功能 - 这是一个CRM,缓存可能发生在客户端或者更可能的是自动在IIS中进行。
顺便说一下,永远不会涉及查询字符串。我通过会话传递一个键。我知道如果我使用查询字符串,它可能部分地绕过缓存问题,但在这种情况下这不是一个选择,而且无论如何,我真正想要的是对发生的事情有更深入的了解。
我做了一些调查,有些人通过使用Server.Transfer来解决这个问题(与Response.Redirect的行为实际上有所不同,某些细节并不总是理想的),还有一些人说要在我想要避免缓存的页面上设置Response.Cache.SetCacheability(HttpCacheability.NoCache)。
我希望能更好地理解这里发生的事情,并可能了解最佳实践 - 首先,我认为.aspx页面总是被标记为避免缓存。是吗?
有什么想法吗?
2个回答

8

默认情况下不会发送设计用于控制缓存的头信息。这使得客户端需要自己制定关于如何缓存所接收内容的规则。

因此,您需要类似以下的内容:

Response.Cache.SetCacheability(HttpCacheability.NoCache) 

为了确保请求(重定向或其他方式)不仅仅使用缓存版本,请进行以下操作。

@Brian:如果我在服务器端处理按钮点击事件,我会这样做。 - AnthonyWJones
+1:快速说明:我在 response.redirect 之前添加了这个东西,但是没有任何作用,我必须将其添加到我不想缓存的页面的 page_load 中,这很有道理,对吧? - lurscher

5
Response.Redirect向浏览器发送响应,告诉它所请求的对象已经移动,并提供新位置。在这种情况下,如果您重定向到“redirect.aspx”,如果浏览器在缓存中有该项,并且满足可缓存性标准,则会从那里显示它。
您提到Response.Transfer,但指的是Server.Transfer。这是一种将执行上下文传输到新页面的服务器端机制。因此,用户在应用程序中请求“main.aspx”。在该页面中,您使用Server.Transfer转移到“transferred.aspx”。在服务器端,它是同一个请求,因此当输出呈现时,客户端的浏览器将显示URL为“main.aspx”,而不是“transferred.aspx”。
总结一下 - Redirect = 2个请求,Transfer = 1个请求。希望这可以帮助您。
是的,如果您希望页面始终调用服务器,则需要设置可缓存性。默认情况下,aspx没有特殊的浏览器行为,因为它只发送html。您可以设置:
例如,Response.Expires = -1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接