Вместо использования директивы OutputCache вы можете сделать то же самое программно, как показано ниже:
if (yourArbitraryCondition) {
OutputCacheParameters outputCacheSettings = new OutputCacheParameters();
outputCacheSettings.Duration = 60;
InitOutputCache(outputCacheSettings);
}
Выполнение этого из OnInit должно работать нормально. И, очевидно, вы можете настроить поведение кэширования, установив различные свойства для OutputCacheParameter, который имеет все те же ручки, что и директива (фактически, это то, что мы генерируем, когда вы используете директиву).
Ключевым моментом является то, что вы выполняете эту логику только условно, а директива делает ее безусловной.
UPDATE:
В качестве альтернативы вы можете использовать API низкоуровневого кэша, на котором построен приведенный выше код. например,
HttpCachePolicy cache = Response.Cache;
cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(Context.Timestamp.AddSeconds(60));
cache.VaryByParams["categoryName"] = true;
По сути, это еще один способ сделать то же самое, без использования какого-либо API, помеченного как «не должен вызываться». В конце концов, так или иначе будет работать, так что выбирайте.