2014-09-12 6 views
4

모든 요청에 ​​대해 Response.Cache.SetNoStore()을 호출하는 CMS 응용 프로그램 코드가 있습니다. 올바른 경우 프록시/cdn이 해당 페이지/콘텐츠를 캐시하지 못하게됩니다. 따라서, 내가 조건 아래의 코드를 호출하고 있습니다 : 따라서Response.Cache.SetNoStore()를 실행 취소하는 방법은 무엇입니까?

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

:

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

을하지만이 응답 헤더에서 어떤 매장 PARAM을 고려하지 않습니다,이 반환 된 HTTP 헤더이다 내 질문은, 어떻게 nostore 매개 변수를 실용적으로 꺼낼 수 있습니까? 이것이 가능하지 않은 경우, PagePreRender 이벤트에서 구문 분석을 시도하고 nostore param이 적용되지 않았으므로 http/header를 구문 분석/수정할 수 있습니다 ... 어느 라이프 사이클이이 것인지 궁금해하게됩니다. 헤더에 추가 되었습니까?

답변

0

전화를 걸면 SetNoStore을 실행 취소 할 수 있습니다. 비공개 인 기본 제공 재설정을 호출하려면 일부 방식으로 광고 소재 라우팅을 사용하여 요청을 다른 방식으로 처리하거나 리플렉션해야합니다.

그런 다음, 기본 HttpCachePolicy 액세스 기본 캐시 정책을 되돌릴 내부 NoStore 필드 또는 문제 Reset을 할당 HttpCachePolicyWrapper에 액세스 할 수 있습니다.

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); 
관련 문제