Я столкнулся с этой же проблемой и обнаружил, что могу использовать подход, аналогичный реализации MVC OutputCacheAttribute
.
Я подтвердил, что правильные заголовки кэша отправляются с ответом и чтопосле пропуска кэша HandleUnknownAction
не вызывается до тех пор, пока не истечет срок действия кэша вывода.
protected override void HandleUnknownAction(string actionName)
{
var Result = View(...);
using (var Page = new OutputCachedPage(ControllerContext, Result))
{
Page.ProcessRequest(HttpContext.ApplicationInstance.Context);
}
}
class OutputCachedPage : Page
{
readonly ControllerContext ControllerContext;
readonly ActionResult Result;
public OutputCachedPage(ControllerContext controllerContext, ActionResult result)
{
if (controllerContext == null) throw new ArgumentNullException("controllerContext");
if (result == null) throw new ArgumentNullException("result");
ControllerContext = controllerContext;
Result = result;
}
protected override void FrameworkInitialize()
{
base.FrameworkInitialize();
InitOutputCache(new OutputCacheParameters
{
Enabled = true,
Duration = 600,
Location = OutputCacheLocation.Any,
VaryByParam = "*"
});
}
protected override void Render(HtmlTextWriter writer)
{
Result.ExecuteResult(ControllerContext);
}
}
Обратите внимание, что аналогичный подход можно использовать в ActionFilterAttribute
для обеспечения более сложного поведения выходного кэша в других сценариях.(например, профили кэша, срок действия которых истекает через заданные интервалы времени, такие как: 00,: 15,: 30,: 45 минут после часа).