在我正在开发的 MVC 应用程序中,出于安全原因,我们必须阻止所有操作的浏览器缓存(防止用户在注销后返回历史记录)。我们使用以下方法实现了这一点这个解决方案 https://stackoverflow.com/a/5664481/2123652.
然而,我们确实希望允许浏览器缓存 css 和 js 包。不幸的是,上面提到的解决方案似乎阻止了所有资源的缓存。在本地计算机上,它甚至包括图像等静态文件,尽管在远程服务器上 IIS 处理这些文件(而不是应用程序本身),因此无需担心这一点。无论如何,有什么方法可以调整这个解决方案以允许浏览器缓存捆绑包吗?
我知道我可以使用像这样的过滤器this one https://stackoverflow.com/a/11574149/2123652并将其添加到所有操作(甚至更好,所有控制器)或添加一个新的基本控制器,默认情况下具有此过滤器,并将我的所有控制器设置为从它继承,但是有没有更好的替代方案(那些不不涉及更改项目中的无数文件)?
附:写下这个问题让我想到了一些我必须尝试的解决方案。这件事以前发生在我身上。我的意思是,在这里写问题时找到正确的答案,但我最终没有发布这些问题。
我在写这个问题时出现的解决方案非常简单。写个简单的就可以了if
里面的条件Application_BeginRequest
根据请求 url 确定资源是否应该可缓存...我还没有测试过它,但听起来它可能就可以完成这项工作。
我们使用全局过滤器完成了您最初的要求。在 Global.asax.cs 中:
GlobalFilters.Filters.Add(new NoCacheAttribute());
无缓存属性:
/// <summary>
/// An attribute that can be attached to an individual controller or used globally to prevent the browser from caching the response.
/// This has nothing to do with server side caching, it simply alters the response headers with instructions for the browser.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class NoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
if (!filterContext.IsChildAction && !(filterContext.Result is FileResult))
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.MinValue);
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);
}
}
}
这会影响我们所有的控制器操作,但不会影响静态内容和其他所有内容。捆绑框架处理自己的缓存:它基本上告诉浏览器永远缓存,但在 URL 中包含一个缓存清除令牌,该令牌是一个哈希值,如果任何捆绑文件被修改,该令牌就会发生变化。该机制不受该过滤器的影响。 (我不知道这是因为未应用全局过滤器,还是因为它产生了 FileResult——我怀疑是前者。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)