在MVC,C#中的每个请求运行一个方法?

在WebForm中,我们可以在MasterPage.cs中编写一个方法,并在每个请求中运行。
例如:

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

我们如何在MVC中做这样的事情?

在ASP.NET MVC中,你可以编写一个自定义的全局动作filter 。


更新:

按照评论部分的要求,这里有一个例子说明这样的filter是怎么样的:

 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(); } } } 

如果您希望此操作筛选器针对每个控制器操作的每个请求运行,则可以在RegisterGlobalFilters方法的global.asax中将其RegisterGlobalFilters为全局操作筛选器:

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

如果你需要这个只执行特定的动作或控制器,只需用这个属性来装饰它们:

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

你可以使用Global.asax Application_AcquireRequestState方法,每个请求都会被调用:

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