在ASP.NET MVC中阻止使用属性进行特定操作的caching
我有一个ASP.NET MVC 3应用程序。 这个应用程序通过JQuery请求logging。 JQuery调用返回结果为JSON格式的控制器操作。 我还没有能够certificate这一点,但我担心我的数据可能会被caching。
我只希望将caching应用于特定的操作,而不是针对所有操作。
有没有一个属性,我可以把一个行动,以确保数据不被caching? 如果没有,我如何确保浏览器每次都得到一组新的logging,而不是一个caching集?
为了确保JQuery不会caching结果,请在您的ajax方法中添加以下内容:
$.ajax({ cache: false //rest of your ajax setup });
或者为了防止在MVCcaching,我们创build了自己的属性,你可以做同样的事情。 这是我们的代码:
[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]
装饰你的控制器。 或者为所有你可以把属性放在inheritance你的控制器的基类的类(如果你有的话),就像我们在这里:
[NoCache] public class ControllerBase : Controller, IControllerBase
你也可以用这个属性装饰一些动作,如果你需要它们是不可caching的,而不是装饰整个控制器。
如果您的课程或操作在浏览器中显示时没有NoCache
,并且您想要检查它是否正常工作,请记住在编译更改后,您需要在浏览器中执行“硬刷新”(Ctrl + F5)。 在此之前,浏览器将保留旧的caching版本,并且不会使用“正常刷新”(F5)进行刷新。
您可以使用内置的caching属性来防止caching。 对于.net 4.x使用:
[OutputCache(NoStore = true, Duration = 0)]
对于.net核心使用:
[ResponseCache(NoStore = true, Duration = 0)]
所有你需要的是:
[OutputCache(Duration=0)] public JsonResult MyAction(
或者,如果您想要为整个控制器禁用它:
[OutputCache(Duration=0)] public class MyController
尽pipe在这里注释的争论,这足以禁用浏览器caching – 这会导致ASP.Net发出响应头,告诉浏览器文档立即过期:
在控制器动作追加到标题下面的行
public ActionResult Create(string PositionID) { Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0. Response.AppendHeader("Expires", "0"); // Proxies.
这里是Mattytommo提出的NoCache
属性,通过使用Chris Moschini的答案中的信息进行简化:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public sealed class NoCacheAttribute : OutputCacheAttribute { public NoCacheAttribute() { this.Duration = 0; } }
对于MVC6( DNX ),没有System.Web.OutputCacheAttirbute
注意:当您设置NoStore
持续时间参数不被考虑。 可以设置首次注册的初始持续时间,并使用自定义属性覆盖该持续时间。
但是我们有Microsoft.AspNet.Mvc.Filters.ResponseCacheFilter
public void ConfigureServices(IServiceCollection services) ... services.AddMvc(config=> { config.Filters.Add( new ResponseCacheFilter( new CacheProfile() { NoStore=true })); } ... )
可以用自定义属性覆盖初始filter
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public sealed class NoCacheAttribute : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext filterContext) { var filter=filterContext.Filters.Where(t => t.GetType() == typeof(ResponseCacheFilter)).FirstOrDefault(); if (filter != null) { ResponseCacheFilter f = (ResponseCacheFilter)filter; f.NoStore = true; //f.Duration = 0; } base.OnResultExecuting(filterContext); } }
这是一个用例
[NoCache] [HttpGet] public JsonResult Get() { return Json(new DateTime()); }
MVC中的输出caching
[OutputCache(NoStore = true,Duration = 0,Location =“None”,VaryByParam =“*”)] 要么 [OutputCache(NoStore = true,Duration = 0,VaryByParam =“None”)]