使用属性在ASP.NET MVC中针对特定操作防止缓存
使用属性在ASP.NET MVC中针对特定操作防止缓存
我有一个ASP.NET MVC 3 应用程序。此应用程序通过jQuery请求记录。jQuery回调到控制器操作,该操作以JSON格式返回结果。我无法证明这一点,但我担心我的数据可能被缓存了。
我只希望缓存应用于特定操作,而不是所有操作。
是否有一个属性可以放在操作上,以确保数据不被缓存?如果没有,如何确保浏览器每次都获得新的记录集,而不是缓存的记录集?
您可以使用内置的缓存属性来防止缓存。
对于.net Framework: [OutputCache(NoStore = true, Duration = 0)]
对于.net Core: [ResponseCache(NoStore = true, Duration = 0)]
请注意,无法强制浏览器禁用缓存。您能做的最好的事情是提供建议,大多数浏览器通常会遵守头部或元标签形式的建议。此装饰属性将禁用服务器缓存,并添加此头文件: Cache - Control:public,no - store,max - age = 0
。它不添加元标签。如果需要,可以在视图中手动添加。
此外,JQuery和其他客户端框架将尝试通过向URL添加时间戳或GUID等内容来欺骗浏览器不使用其已缓存的资源版本。这有效地使浏览器再次请求资源,但并不能真正防止缓存。
最后,请注意。资源也可以在服务器和客户端之间缓存。ISP、代理和其他网络设备也会缓存资源,它们通常使用内部规则而不查看实际资源。这方面您无法做太多。好消息是,它们通常会以秒或分钟为单位缓存资源。
为确保JQuery不对结果进行缓存,在您的ajax方法中添加以下内容:\n\n\n
$.ajax({ cache: false //rest of your ajax setup });
\n\n\n或者为了防止MVC中的缓存,我们创建了自己的attribute,您也可以这样做。这是我们的代码:\n\n\n
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public sealed class NoCacheAttribute : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); filterContext.HttpContext.Response.Cache.SetNoStore(); base.OnResultExecuting(filterContext); } }
\n\n\n然后只需在您的controller上装饰[NoCache]
。或者,如果您拥有一个基类并从中继承您的控制器,则可以将attribute放在基类的类或控制器上,就像我们在这里所做的那样:\n\n\n
[NoCache] public class ControllerBase : Controller, IControllerBase
\n\n\n如果您需要某些操作不可缓存,可以将此attribute应用于某些操作,而不是在整个controller上应用。\n\n\n如果您的类或操作在浏览器中呈现时没有NoCache
,但您想检查它是否起作用,请记住在编译更改后,您需要进行“硬刷新”(Ctrl+F5)以刷新您的浏览器。在这样做之前,您的浏览器将保留旧的缓存版本,并且不会使用“正常刷新”(F5)进行更新。