2014-09-12 57 views
4

我有一個CMS應用程序代碼,在所有請求中調用Response.Cache.SetNoStore(),如果我是正確的,這將防止代理/ CDN緩存這些頁面/內容。因此,我呼籲有條件下面的代碼:如何撤消Response.Cache.SetNoStore()?

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

但這並不取出從響應頭無店PARAM,這是返回的HTTP標頭:

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

因此我的問題是,我怎樣才能拿出諾斯托爾param實用?如果這是不可能的,我如何/在哪裏可以解析/修改http-header,因爲我試圖在PagePreRender事件上解析並且nostore param沒有被應用......這導致想知道哪個生命週期是這樣的附加到標題?

回答

0

有一種方法可以在您調用它時撤銷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);