Выполнять код при каждом запросе в ASP.NET MVC

У меня есть контроллер, от которого наследуются все мои контроллеры, и мне нужно выполнить некоторый код для каждого запроса контроллера. Я пробовал следующее:

protected override void Execute(System.Web.Routing.RequestContext requestContext)
{
    if (Session["mallDetected"] == null)
    {
        Session["mallDetected"] = DateTime.Now.Ticks;
        IList<Mall> malls = Mall.FindNearestByIp(Request.UserHostAddress);

        if (malls.Count > 0)
        {
            Session["mall"] = malls[0];
        }
    }

    base.Execute(requestContext);
}

Но, по-видимому, состояние сеанса недоступно в методе Execute до ПОСЛЕ вызова base.Execute(), что у меня не работает. Есть ли место, где я могу выполнить этот код сеанса для каждого запроса в ASP.NET MVC?


person Chris    schedule 30.07.2009    source источник
comment
Почему бы вам просто не использовать ActionFilter?   -  person mmx    schedule 31.07.2009
comment
Ты прав, Мехрдад, это именно то, что мне было нужно.   -  person Chris    schedule 31.07.2009


Ответы (2)


Попробуйте переопределить OnActionExecuted в базовом контроллере или реализовать функциональность в виде фильтра.

person krohrbaugh    schedule 30.07.2009
comment
+1 за предложение фильтра. Я совсем забыл об этом. - person Chris; 31.07.2009
comment
См. здесь пример пользовательского глобального фильтра действий: stackoverflow.com/questions/9511462/ - person Aaron Hoffman; 17.05.2014

Если вы хотите, чтобы что-то происходило в приложении ASP.NET при каждом запросе, вам, вероятно, лучше встроить его в IHttpModule, а не в контроллер. Как вы гарантируете, что ваш преемник правильно реализует ваш контроллер?

person Wyatt Barnett    schedule 30.07.2009