NET MVC 如何禁用自动缓存选项?

如何禁用 asp.Net mvc 应用程序的自动浏览器缓存?

因为我有一个问题与缓存,因为它缓存所有链接。但有时它会自动重定向到 DEFAULT 索引页 存储它缓存,然后所有的时间,我点击该链接,它会重定向我到 DEFAULT 索引页面。

那么有人知道如何从 ASP.NET MVC 4手动禁用缓存选项吗?

99115 次浏览

您可以使用 OutputCacheAttribute来控制服务器和/或浏览器缓存中的特定操作或控制器中的所有操作。

禁用控制器中的所有操作

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

如果要对所有控制器中的所有操作应用默认缓存策略,可以通过编辑 global.asax.cs并查找 RegisterGlobalFilters方法来添加 全局动作过滤器全局动作过滤器。此方法添加到默认的 MVC 应用程序项目模板中。

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

这将导致它将上面指定的 OutputCacheAttribute应用于每个操作,这将禁用服务器和浏览器缓存。通过将 OutputCacheAttribute添加到特定的操作和控制器,您仍然可以覆盖这种无缓存。

HackedByChinese 没有抓住重点。他把服务器缓存和客户端缓存搞混了。OutputCacheAttribute 控制服务器缓存(IIS http.sys 缓存) ,而不是浏览器(客户端)缓存。

我只给你我代码库的一小部分,好好利用。

[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
{
// ...
}

明智地使用它,因为它实际上禁用了所有客户端缓存。唯一没有禁用的缓存是“后退按钮”浏览器缓存。但似乎真的没有办法绕过它。也许只能通过使用 javascript 来检测它,并强制页面或页面区域刷新。

如果要防止浏览器缓存,可以使用 这段来自 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);
}

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

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

如果你想从你的特定操作或控制器中禁用缓存,你可以通过修饰特定的操作方法来覆盖配置缓存设置,如下所示:

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

希望这一点很清楚,对你有用。

对于页面解决方案,请在布局页面中设置以下内容:

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

为了让所有人都能看到我的答案,我把我的评论移到回答这个问题上。

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

这将在所有的浏览器(IE,Firefox 和 Chrome 也是如此)中工作。 很高兴听到我的回答对你起作用了@Joseph Katzman