routeconfig route mvc maproute httpget attribute asp asax c# asp.net-mvc asp.net-mvc-3

mvc - route web api 2 c#



Ejecutar un método en cada solicitud en MVC, C#? (2)

En WebForm podríamos escribir un método en MasterPage.cs y se ejecutó en cada solicitud.
p.ej:

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

¿Cómo podemos hacer algo como esto en MVC?


En ASP.NET MVC, puede escribir un filtro de acción global personalizado .

ACTUALIZAR:

Tal como se solicitó en la sección de comentarios, aquí hay un ejemplo de cómo podría verse ese filtro:

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

Si desea realizar una autorización basada en el valor de la cookie, sería más correcto implementar la interfaz 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(); } } }

Si desea que este filtro de acción se ejecute en cada solicitud para cada acción del controlador, puede registrarlo como filtro de acción global en su archivo global.asax en el método RegisterGlobalFilters :

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

Y si necesita que esto se ejecute solo para acciones o controladores particulares, simplemente decore con este atributo:

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


Puede usar el método Global.asax Application_AcquireRequestState que se llamará en cada solicitud:

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