我想在我的 ASP.NET (MVC) 应用程序中将 Cache-Control
header 设置为 public
。问题是有一些代码(我无法更改)以前像这样设置缓存策略:
var response = htmlHelper.ViewContext.HttpContext.Response;
response.Cache.SetExpires(System.DateTime.UtcNow.AddDays(-1));
response.Cache.SetValidUntilExpires(false);
response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
response.Cache.SetCacheability(HttpCacheability.NoCache);
response.Cache.SetNoStore();
稍后我找不到覆盖它的方法,因为无论我如何尝试设置缓存控制,上面都会生效。例如。以下都不能对抗之前禁用的缓存:
httpContext.Response.Headers["Cache-Control"] = "public";
var cache = httpContext.Response.Cache;
cache.SetExpires(cacheItem.ValidUntilUtc);
cache.SetValidUntilExpires(true);
cache.SetRevalidation(HttpCacheRevalidation.None);
cache.SetCacheability(HttpCacheability.Public);
cache.SetMaxAge(cacheItem.ValidUntilUtc - _clock.UtcNow);
有没有办法以某种方式覆盖或重置缓存策略?
最佳答案
显然这不可能,因为 HttpCachePolicy
会主动阻止您设置“更高”的可缓存性,即如果您在设置 NoCache 后尝试设置 Public,则什么也不会发生。
似乎唯一的 hackish 方法是使用私有(private)反射并调用内部 Reset
方法,如下所示:
var cache = httpContext.Response.Cache;
var cachePolicy = (HttpCachePolicy)typeof(HttpCachePolicyWrapper).InvokeMember("_httpCachePolicy", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField, null, cache, null);
typeof(HttpCachePolicy).InvokeMember("Reset", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, cachePolicy, null);
cache.SetCacheability(HttpCacheability.Public);
关于c# - 覆盖 ASP.NET 缓存策略并将 Cache-Control 设置为 public,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29825727/