ASP.NET MVC 5: вывод кэширующего дочернего действия программно

Мне нужно заставить кэшировать определенное дочернее действие при входе пользователя в систему, потому что я должен избегать кэширования этого дочернего действия родительским действием, которое использует AuthorizeAttribute. Однако при программном вызове дочернего действия внутри метода действия Login для его кэширования кэширование не работает.

Вызов дочернего действия:

HomeController homeController = new HomeController();
var actionResult = homeController.MainMenu();

Детское действие:

[OutputCacheAttribute(Duration = 300, VaryByCustom = "User")]
[ChildActionOnly]
public ActionResult MainMenu()
{
    return PartialView("MainMenu");
}

Дополнение:

Мне известно, что эта процедура противоречит концепции процесса кэширования. Однако мне нужно сделать это, потому что логин может перенаправить пользователя на его страницу выхода, где дочернее действие может быть вызвано действием, которое использует AuthorizeAttribute. Дочернее действие является частью страницы макета, поэтому мне нужно, чтобы оно было предварительно обработано/кэшировано методом действия, который не использует атрибут авторизации. Это связано с тем, что AuthorizeAttribute не поддерживает кэширование вывода дочерних действий.


person Hello It's me    schedule 17.12.2015    source источник
comment
Что заставляет вас думать, что кеш вывода не работает, если в игре Authorize?   -  person Chris Pratt    schedule 18.12.2015
comment
@ChrisPratt Когда вы заглядываете внутрь кода AuthorizeAttribute, вы можете найти этот комментарий   -  person Hello It's me    schedule 18.12.2015
comment
Это проблема только в том случае, если само дочернее действие требует авторизации, чего в любом случае делать не следует.   -  person Chris Pratt    schedule 18.12.2015


Ответы (2)


Дочерние действия — это действия, вызываемые внутри представлений с помощью помощника Html.Action().

Вы должны вызывать свое дочернее действие внутри вашего входа в систему, а не внутри действия ваших контроллеров.

Я считаю, что кэширование вывода должно работать тогда.

Вы должны прочитать о кэшировании Donut и Donut Hole http://www.dotnet-tricks.com/Tutorial/mvc/ODJa210113-Donut-Caching-and-Donut-Hole-Caching-with-Asp.Net.-MVC-4.html

Я считаю, что это то, чего вы пытаетесь достичь здесь.

person Vilius K.    schedule 18.12.2015
comment
Проблема в том, что дочернее действие, которое мне нужно кэшировать, не вызывается представлением входа, потому что представление входа использует другой файл макета. - person Hello It's me; 18.12.2015
comment
Я не понимаю, чего вы пытаетесь достичь, не могли бы опубликовать остальную часть родительского действия, в котором вы вызываете свое дочернее действие? - person Vilius K.; 19.12.2015

Кэш вывода обрабатывается механизмом обработки запросов. Прямой вызов метода ничего из этого не активирует. Я не уверен, чего вы пытаетесь достичь здесь, но, похоже, это все равно бессмысленно. При первом отображении дочернего действия оно будет кэшировано для пользователя. Заполнение кеша при входе в систему перемещает только те несколько миллисекунд времени обработки от одного запроса к другому. В любом случае пользователь подвергается первоначальной нагрузке дочернего действия, это только тот случай, когда. Учитывая это, просто позвольте природе идти своим чередом, и пусть это произойдет, когда это необходимо: в первый раз, когда это необходимо.

person Chris Pratt    schedule 17.12.2015
comment
Я обновил свой вопрос, чтобы уточнить, почему в моем случае мне нужно это сделать. Впрочем, вы, конечно, правы в своей точке зрения. - person Hello It's me; 18.12.2015