use*_*696 5 c# asp.net iis caching cache-control
我有一个CMS应用程序代码,该代码调用Response.Cache.SetNoStore()所有请求,如果我是对的,这将防止代理/ cdn缓存那些页面/内容。因此,我有条件地调用以下代码:
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetMaxAge(new TimeSpan(0, 30, 0));
Response.Cache.SetValidUntilExpires(true);
Run Code Online (Sandbox Code Playgroud)
但这不会从响应标头中删除无存储参数,这是返回的http标头:
Cache-Control:public, no-store, must-revalidate, max-age=1800
Run Code Online (Sandbox Code Playgroud)
因此,我的问题是,我该如何实用地删除nostore参数?如果这不可能,那么我如何/在哪里解析/修改http-header,因为我尝试在PagePreRender事件上进行解析并且没有应用nostore参数...这使人怀疑这是哪个生命周期附加到标题?
有一种方法可以SetNoStore在调用后撤消。您需要使用一些创造性的路由以不同的方式处理请求或反射来调用私有的内置重置。
您可以访问HttpCachePolicyWrapper底层HttpCachePolicy,然后分配内部NoStore字段或问题Reset以恢复到默认缓存策略。
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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1330 次 |
| 最近记录: |