Подтвердить что ты не робот

Выполнить метод в каждом запросе в MVC, С#?

В WebForm мы могли написать метод в MasterPage.cs, и он запускался в каждом запросе.
например:

MasterPage.cs
--------------
protected void Page_Load(object sender, EventArgs e)
{
   CheckCookie();
}

Как мы можем сделать что-то подобное в MVC?

4b9b3361

Ответ 1

В ASP.NET MVC вы можете написать настраиваемый глобальный фильтр действий.


UPDATE:

В соответствии с запросом в разделе комментариев здесь приведен пример того, как выглядит такой фильтр:

public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var fooCookie = filterContext.HttpContext.Request.Cookies["foo"];
        // TODO: do something with the foo cookie
    }
}

Если вы хотите выполнить авторизацию на основе значения cookie, было бы правильнее реализовать интерфейс IAuthorizationFilter:

public class MyActionFilterAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        var fooCookie = filterContext.HttpContext.Request.Cookies["foo"];

        if (fooCookie == null || fooCookie.Value != "foo bar")
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}

Если вы хотите, чтобы этот фильтр действий запускался по каждому запросу для каждого действия контроллера, вы можете зарегистрировать его как глобальный фильтр действий в вашем global.asax в методе RegisterGlobalFilters:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new MyActionFilterAttribute());
}

И если вам нужно, чтобы это выполнялось только для определенных действий или контроллеров, просто украшайте их этим атрибутом:

[MyActionFilter]
public ActionResult SomeAction()
{
    ...
}

Ответ 2

Вы можете использовать метод Global.asax Application_AcquireRequestState, который будет вызываться по каждому запросу:

    protected void Application_AcquireRequestState(object sender, EventArgs e)
    {
     //...
    }