ASP.NET MVC如何禁用自动caching选项?

如何从asp.Net mvc应用程序禁用自动浏览器caching?

因为caching所有链接时遇到了caching问题。 但有时它会自动redirect到DEFAULT INDEX PAGE存储caching,然后我一直点击该链接将它redirect到DEFAULT INDEX PAGE。

所以有人知道如何从ASP.NET MVC 4手动禁用caching选项?

您可以使用OutputCacheAttribute控制服务器和/或浏览器caching,以实现特定操作或控制器中的所有操作。

禁用控制器中的所有操作

 [OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will be applied to all actions in MyController, unless those actions override with their own decoration public class MyController : Controller { // ... } 

禁用特定操作:

 public class MyController : Controller { [OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will disable caching for Index only public ActionResult Index() { return View(); } } 

如果要将默认caching策略应用于所有控制器中的所有操作,可以通过编辑global.asax.cs并查找RegisterGlobalFilters方法来添加全局操作filter 。 这个方法被添加到默认的MVC应用程序项目模板中。

 public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new OutputCacheAttribute { VaryByParam = "*", Duration = 0, NoStore = true, }); // the rest of your global filters here } 

这将导致它将上面指定的OutputCacheAttribute应用于每个操作,这将禁用服务器和浏览器caching。 您应该仍然可以通过将OutputCacheAttribute添加到特定的操作和控制器来覆盖此no-cache。

HackedByChinese错过了这一点。 他误以为客户端caching服务器caching。 OutputCacheAttribute控制服务器caching(IIS http.syscaching),而不是浏览器(客户端)caching。

我给你我的代码库的一小部分。 明智地使用它。

 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)] public sealed class NoCacheAttribute : FilterAttribute, IResultFilter { public void OnResultExecuting(ResultExecutingContext filterContext) { } public void OnResultExecuted(ResultExecutedContext filterContext) { var cache = filterContext.HttpContext.Response.Cache; cache.SetCacheability(HttpCacheability.NoCache); cache.SetRevalidation(HttpCacheRevalidation.ProxyCaches); cache.SetExpires(DateTime.Now.AddYears(-5)); cache.AppendCacheExtension("private"); cache.AppendCacheExtension("no-cache=Set-Cookie"); cache.SetProxyMaxAge(TimeSpan.Zero); } } 

用法:

 /// will be applied to all actions in MyController [NoCache] public class MyController : Controller { // ... } 

明智地使用它,因为它确实禁用了所有的客户端caching。 未禁用的唯一caching是“后退button”浏览器caching。 但似乎真的没有办法解决这个问题。 也许只能使用javascript来检测它,并强制页面或页面区域刷新。

我们可以在Web.config文件中设置cachingconfiguration文件,而不是在页面中单独设置caching值,以避免冗余代码。 我们可以通过使用OutputCache属性的CacheProfile属性来引用configuration文件。 此cachingconfiguration文件将应用于所有页面,除非页面/方法覆盖这些设置。

 <system.web> <caching> <outputCacheSettings> <outputCacheProfiles> <add name="CacheProfile" duration="60" varyByParam="*" /> </outputCacheProfiles> </outputCacheSettings> </caching> </system.web> 

如果您想禁用特定操作或控制器的caching,则可以通过装饰特定的操作方法来覆盖configurationcaching设置,如下所示:

 [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] public ActionResult NoCachingRequired() { return PartialView("abcd"); } 

希望这是清楚的,对你有用。

如果你想阻止浏览器caching,你可以使用ShareFunction中的这个代码

 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); } 

对于页面解决scheme,请在布局页面中进行设置:

 <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Expires" content="0">