如何撤消 Response.Cache.SetNoStore()? [英] How to undo Response.Cache.SetNoStore()?

查看:18
本文介绍了如何撤消 Response.Cache.SetNoStore()?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 CMS 应用程序代码,它在所有请求上调用 Response.Cache.SetNoStore(),如果我是正确的,这将阻止代理/cdn 缓存这些页面/内容.因此,我有条件地调用以下代码:

I've a CMS application code which calls Response.Cache.SetNoStore() on all request and if i'm correct, this will be prevents proxies/cdn to cache those pages/content. Therefore, i'm conditionally calling the below code:

Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetMaxAge(new TimeSpan(0, 30, 0));
Response.Cache.SetValidUntilExpires(true);

但这并没有从响应头中取出 no-store 参数,这是返回的 http 头:

But this doesn't take out the no-store param from the response header, this is the returned http header:

Cache-Control:public, no-store, must-revalidate, max-age=1800

因此我的问题是,我怎样才能实用地取出 nostore 参数?如果这是不可能的,我如何/在哪里可以解析/修改 http-header,因为我试图解析 PagePreRender 事件并且没有应用 nostore 参数......这导致想知道这是哪个生命周期附加到标题?

Therefore my question is, how can i take out the nostore param pragmatically? If this isn't possible, how/where can i parse/modify the http-header, because i tried to parsed on PagePreRender event and the nostore param hasn't been applied...which leads to wonder at which life cycle is this appended to the header?

推荐答案

一旦调用 SetNoStore 就有一种方法可以撤消它.您需要使用一些创造性的路由以不同的方式处理请求或反射来调用私有的内置重置.

There is a way to undo SetNoStore once you call it. You need to use some creative routing to process the request in a different way or reflection to invoke the built-in reset that is private.

您可以访问HttpCachePolicyWrapper 访问底层 HttpCachePolicy,然后分配内部 NoStore 字段或发出 Reset 以恢复到默认缓存策略.

You can get access to HttpCachePolicyWrapper to access the underlying HttpCachePolicy, then assign the internal NoStore field or issue Reset to revert to the default cache policy.

response.Cache.SetNoStore(); // assign no-store
BindingFlags hiddenItems = BindingFlags.NonPublic | BindingFlags.Instance;
var httpCachePolicyWrapper = response.Cache.GetType(); // HttpCachePolicyWrapper type

var httpCache = httpCachePolicyWrapper.InvokeMember("_httpCachePolicy", BindingFlags.GetField | hiddenItems, null, response.Cache, null);
var httpCachePolicy = httpCache.GetType(); // HttpCachePolicy type

// Reset Cache Policy to Default    
httpCachePolicy.InvokeMember("Reset", BindingFlags.InvokeMethod | hiddenItems, null, httpCache, null);
var resetAllCachePolicy = httpCachePolicy.InvokeMember("_noStore", BindingFlags.GetField | hiddenItems, null, httpCache, null);

response.Cache.SetNoStore(); // assign no-store

// Undo SetNoStore Cache Policy
httpCachePolicy.InvokeMember("_noStore", BindingFlags.SetField | hiddenItems, null, httpCache, new object[] { false });
var resetNoStoreOnly = httpCachePolicy.InvokeMember("_noStore", BindingFlags.GetField | hiddenItems, null, httpCache, null);

这篇关于如何撤消 Response.Cache.SetNoStore()?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆