如何从ASP.NET MVC应用程序禁用自动浏览器缓存?
因为我在缓存时遇到问题,因为它缓存了所有链接。但是有时它会自动重定向到DEFAULT INDEX PAGE,并存储它的缓存,然后每次我单击该链接时,它都会将我重定向到DEFAULT INDEX PAGE。
因此,有人知道如何从ASP.NET MVC 4中手动禁用缓存选项吗?
如何从ASP.NET MVC应用程序禁用自动浏览器缓存?
因为我在缓存时遇到问题,因为它缓存了所有链接。但是有时它会自动重定向到DEFAULT INDEX PAGE,并存储它的缓存,然后每次我单击该链接时,它都会将我重定向到DEFAULT INDEX PAGE。
因此,有人知道如何从ASP.NET MVC 4中手动禁用缓存选项吗?
Answers:
您可以使用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();
}
}
如果要对所有控制器中的所有操作应用默认的缓存策略,则可以通过编辑和查找方法来添加全局操作过滤器。在默认的MVC应用程序项目模板中添加了此方法。global.asax.cs
RegisterGlobalFilters
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new OutputCacheAttribute
{
VaryByParam = "*",
Duration = 0,
NoStore = true,
});
// the rest of your global filters here
}
这将使它对OutputCacheAttribute
所有操作应用上面指定的内容,这将禁用服务器和浏览器缓存。您仍然可以通过添加OutputCacheAttribute
到特定的操作和控制器来覆盖此无缓存。
RegisterGlobalFilters
方法的任何人,有时它都存在于中,App_Start\FilterConfig.cs
而不是中Global.asax.cs
。
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进行检测并强制页面或页面区域刷新。
Cache-Control: public, no-store, max-age=0 Expires: Mon, 22 Oct 2012 20:19:26 GMT Last-Modified: Mon, 22 Oct 2012 20:19:26 GMT
)。因此,它将防止服务器和浏览器缓存。我知道奇怪的是public
,除了不存储外,它还会设置,但最终的效果是不存储和立即到期。
Cache-Control: public, no-cache="Set-Cookie", no-store, max-age=0
&Expires
+Vary
设置中。该解决方案将导致Cache-Control: no-cache, proxy-revalidate, private, no-cache=Set-Cookie
,Expires=-1
和Pragma=no-cache
。由于它们都可以很好地控制浏览器缓存,因此不确定是什么问题。
我们可以在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");
}
希望这很清楚,对您有用。
如果要防止浏览器缓存,则可以从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);
}
对于页面解决方案,请在布局页面中进行以下设置:
<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="non-cache, no-store, must-revalidate">
meta
上面列出的所有标签,但没有任何效果。您的评论应包含在答案中。