Asp.net mvc 3 如何拦截MVC应用程序中的所有控制器调用?

Asp.net mvc 3 如何拦截MVC应用程序中的所有控制器调用?,asp.net-mvc-3,debugging,logging,Asp.net Mvc 3,Debugging,Logging,在MVC-3中是否有一种快速的方法来拦截所有控制器调用 出于日志记录和测试的目的,我想构建一个工具,该工具可以拦截所有控制器调用,并记录调用了哪个控制器、使用了哪个消息、何时调用。根据站点的大小,您可以在框架的控制器类和主控制器之间的层次结构中创建一个类 差不多 public class MyBaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext filt

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


出于日志记录和测试的目的,我想构建一个工具,该工具可以拦截所有控制器调用,并记录调用了哪个控制器、使用了哪个消息、何时调用。

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

差不多

public class MyBaseController : Controller {
    protected override void OnActionExecuting(ActionExecutingContext filterContext) {
        // your logging stuff here
        base.OnActionExecuting(filtercontext);
    }
}
然后您的其他控制器可以从中继承,例如

public class HomeController : MyBaseController {
    // action methods...
}

Phil Haack开发了一个路由调试器


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

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");
    }
}
要使用它,只需将其添加到global.asax中的全局过滤器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new LogActionFilter());
}
我现在去看看能不能找到源头


编辑:找到了它。它来自。

您可以使用自己的控制器工厂并进行注册: From:(网络上的许多示例-在需要的地方插入日志记录)

改编自:


另外,您还可以使用面向方面编程(AOP)的一些方法,通过postsharp或spring进行注入。net有一个引擎,您也可以用来拦截调用(这超出了控制器的范围,但您可以在配置文件中设置一个regex,以应用于上面有“controller”名称的类。这个答案直接来自Microsoft文档。 using System; using System.Configuration; using System.Web.Mvc; using System.Web.Routing; namespace IControllerFactorySample.ControllerFactories { public class YourControllerFactory : IControllerFactory { #region IControllerFactory Members public IController CreateController(RequestContext requestContext, string controllerName) { if (string.IsNullOrEmpty(controllerName)) throw new ArgumentNullException("controllerName"); IController controller = Activator.CreateInstance(Type.GetType(controllerName)) as IController; return controller; } public void ReleaseController(IController controller) { if (controller is IDisposable) (controller as IDisposable).Dispose(); else controller = null; } #endregion } }
ControllerBuilder.Current.SetControllerFactory(
                typeof(YourControllerFactory));