在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发出响应头,告诉浏览器文档立即过期:

OutputCache持续时间= 0响应标题:max-age = 0,s-maxage = 0

在控制器动作追加到标题下面的行

  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”)]