Возможно ли в C # кэшировать выходные данные переопределения HandleUnknownAction ()? - PullRequest
1 голос
/ 12 марта 2012

Привет и спасибо за внимание!

Фон

C #, .NET 4.0, MVC, в настоящее время работает в режиме отладки на локальном хосте.

Вопрос

Возможно ли кэшировать результат переопределения HandleUnknownAction ()?

Я пытаюсь это сделать, но, похоже, ничего не кешируется.

Вот пример:

[OutputCache(Duration = 600, Location = OutputCacheLocation.Server, VaryByParam = "actionName")]
protected override void HandleUnknownAction(string actionName)
{    
     View("SomeView").ExecuteResult(ControllerContext);    
}

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Не думаю, что вы можете, и вот почему: если вы ссылаетесь на документацию MSDN по классу OutputCacheAttribute ( здесь ), вы можете увидеть определение, так как оно кэширует вывод метода действия.В этом случае метод Controller.HandleUnknownAction() возвращает void, поэтому равно без вывода в кэш .

Так что, к сожалению, я так не думаюработает так.

0 голосов
/ 23 ноября 2013

Я столкнулся с этой же проблемой и обнаружил, что могу использовать подход, аналогичный реализации 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 минут после часа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...