在ASP.NET MVC中阻止使用属性进行特定操作的缓存
我有一个ASP.NET MVC 3应用程序。 此应用程序通过JQuery请求记录。 JQuery返回一个以JSON格式返回结果的控制器动作。 我无法证明这一点,但我担心我的数据可能会被缓存。
我只希望将缓存应用于特定的操作,而不是针对所有操作。
是否有一个属性可以让我确保数据不会被缓存? 如果不是,我如何确保浏览器每次都得到一组新记录,而不是缓存集?
为了确保JQuery不会缓存结果,请在您的ajax方法中添加以下内容:
$.ajax({
cache: false
//rest of your ajax setup
});
或者为了防止在MVC中缓存,我们创建了自己的属性,你可以做同样的事情。 这是我们的代码:
[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);
}
}
然后用[NoCache]
装饰你的控制器。 或者为了所有你可以把属性放在继承你的控制器的基类的类(如果你有一个),就像我们在这里:
[NoCache]
public class ControllerBase : Controller, IControllerBase
如果你需要它们是不可缓存的,你也可以用这个属性修饰一些动作,而不是装饰整个控制器。
如果您的课程或操作在您的浏览器中显示时没有NoCache
,并且您想检查它是否正常工作,请记住在编译更改后,您需要在浏览器中执行“硬刷新”(Ctrl + F5)。 直到你这样做,你的浏览器将保留旧的缓存版本,并且不会用“正常刷新”(F5)刷新它。
您可以使用内置的缓存属性来防止缓存。
对于.net框架: [OutputCache(NoStore = true, Duration = 0)]
对于.net核心: [ResponseCache(NoStore = true, Duration = 0)]
请注意,强制浏览器禁用缓存是不可能的。 您所能做的最好的是提供大多数浏览器会提供的建议,通常以标头或元标记的形式提供。 此decorator属性将禁用服务器缓存,并添加以下标头: Cache-Control: public, no-store, max-age=0
。 它不会添加元标记。 如果需要,可以在视图中手动添加。
此外,JQuery和其他客户端框架将尝试通过向URL添加内容来诱使浏览器不使用它的缓存版本的资源,如时间戳或GUID。 这在使浏览器再次请求资源时非常有效,但并不能真正阻止缓存。
在最后的笔记。 您应该知道资源也可以缓存在服务器和客户端之间。 ISP的代理和其他网络设备也会缓存资源,并且他们通常使用内部规则而不查看实际资源。 关于这些你可以做的事情不多。 好消息是,它们通常缓存较短的时间帧,如秒或分钟。
所有你需要的是:
[OutputCache(Duration=0)]
public JsonResult MyAction(
或者,如果你想为整个控制器禁用它:
[OutputCache(Duration=0)]
public class MyController
尽管在这里有评论的争论,但这足以禁用浏览器缓存 - 这会导致ASP.Net发出响应头,告诉浏览器文档立即过期:
链接地址: http://www.djcxy.com/p/9499.html上一篇: Prevent Caching in ASP.NET MVC for specific actions using an attribute