如何拦截MVC应用程序中的所有控制器调用?

blu*_*lds 14 debugging logging asp.net-mvc-3

是否有一种快速方法可以拦截MVC-3中的所有控制器调用?

为了进行日志记录和测试,我想构建一个工具,可以拦截所有控制器调用,并记录调用哪个控制器,在哪个时间使用哪条消息.

Joh*_*n H 22

我不记得我从哪里得到这个,但我一直在寻找类似的东西,发现一个文章或某个地方包含这个日志过滤器:

public class LogActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Log("OnActionExecuting", filterContext.RouteData);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        Log("OnActionExecuted", filterContext.RouteData);
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        Log("OnResultExecuting", filterContext.RouteData);
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        Log("OnResultExecuted", filterContext.RouteData);
    }

    private void Log(string methodName, RouteData routeData)
    {
        var controllerName = routeData.Values["controller"];
        var actionName = routeData.Values["action"];
        var message = string.Format("{0} controller: {1} action: {2}", methodName, controllerName, actionName);
        Debug.WriteLine(message, "Action Filter Log");
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它,只需将其添加到global.asax中的全局过滤器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new LogActionFilter());
}
Run Code Online (Sandbox Code Playgroud)

我现在看看我是否能找到源码.

编辑:找到它.这是来自这个问题.


Dav*_*ave 5

根据站点的大小,您可以在框架的Controller类和主控制器之间的层次结构中创建一个类。

就像是

public class MyBaseController : Controller {
    protected override void OnActionExecuting(ActionExecutingContext filterContext) {
        // your logging stuff here
        base.OnActionExecuting(filtercontext);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,其余的控制器可以从中继承,例如

public class HomeController : MyBaseController {
    // action methods...
}
Run Code Online (Sandbox Code Playgroud)