Как отменить Response.Cache.SetNoStore()?

У меня есть код приложения CMS, который вызывает Response.Cache.SetNoStore() по всему запросу, и если я прав, это будет препятствовать прокси-серверам/cdn кэшировать эти страницы/содержимое. Поэтому я условно вызываю код ниже:

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

Но это не выводит параметр no-store из заголовка ответа, это возвращаемый HTTP-заголовок:

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

Поэтому мой вопрос заключается в том, как я могу вынести параметр nostore param прагматически? Если это невозможно, то как/где я могу разобрать/изменить http-заголовок, потому что я попытался разобрать событие PagePreRender, и параметр nostore не был применен..., что приводит к удивлению, при котором жизненный цикл добавлено в заголовок?

Ответ 1

Существует способ отменить SetNoStore после его вызова. Вам нужно использовать некоторую творческую маршрутизацию для обработки запроса другим способом или отражением, чтобы вызвать встроенный reset, который является приватным.

Вы можете получить доступ к 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);