在MVC-3中有没有快速拦截所有控制器调用的方法?
出于日志记录和测试的目的,我想构建一个可以拦截所有控制器调用的工具,并记录哪个控制器被调用,使用哪个消息,在什么时间。
发布于 2012-02-22 03:36:54
我不记得我是从哪里得到这个的,但我在一段时间前四处寻找了类似的东西,发现了一篇文章或某处包含这个日志过滤器的东西:
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());
}我现在就去看看能不能找到来源。
编辑:找到了。是this question发来的。
发布于 2012-02-22 03:31:20
根据站点已经有多大,您可以在框架的Controller类和主控制器之间的层次结构中创建一个类。
就像这样
public class MyBaseController : Controller {
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
// your logging stuff here
base.OnActionExecuting(filtercontext);
}
}然后你的其他控制器可以从这个继承,例如
public class HomeController : MyBaseController {
// action methods...
}发布于 2012-02-22 03:31:39
有一个由Phil Haack开发的路由调试器
https://stackoverflow.com/questions/9383808
复制相似问题