c# - 覆盖 ASP.NET 缓存策略并将 Cache-Control 设置为 public

标签 c# asp.net asp.net-mvc caching

我想在我的 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/

相关文章:

javascript - 文本区域中的新行字符增加了 C# 中的文本长度

c# - 断言 2 个对象相等

javascript - 尝试在页面加载时填充 telerik ddl 时出错

c# - 在 C# 中,控件不能从一个案例标签 ('default:' ) 掉落到另一个案例标签

asp.net - 登录页面的问题

javascript - 使用 jquery 进行拼写检查有什么问题吗

c# - 写入 300dpi 图像时出现内存不足异常

c# - 在 razor view Asp.net Mvc 4 中实例化一个对象

c# - 是否有一行代码可以获取该字符串的特定部分?

c# - 如何将字符串列表数据绑定(bind)到 WPF/WP7 中的 ListBox?