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">