2012-02-21 2 views
13

Есть ли быстрый способ перехвата всех вызовов контроллера в MVC-3?Как перехватить все вызовы контроллера в приложении MVC?

Для ведения журнала и тестирования я хотел бы создать инструмент, который может перехватывать все вызовы контроллера и регистрировать, какой контроллер был вызван, с каким сообщением, в какое время.

ответ

21

Я не могу вспомнить, где я получил от этого, но я искал вокруг что-то подобное некоторое время назад и нашел статьи или что-то где-то, что содержащиеся этот протоколирования фильтр:

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.

4

В зависимости от того, насколько большой сайт уже создан, вы можете создать класс в иерархии между классом Controller и основными контроллерами.

Что-то вроде

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

Тогда остальные контроллеры могут наследовать от этого, например,

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

Вы можете использовать свой собственный контроллер завода и зарегистрировать его, а также: From: (многие, например в сети - вставить протоколирование, где вы хотите)

адаптировано из: http://www.keyvan.ms/custom-controller-factory-in-asp-net-mvc

 
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 
    } 
}

не забудьте для регистрации в global.asax.cs

ControllerBuilder.Current.SetControllerFactory(
       typeof(YourControllerFactory)); 
+0

PS Вы также можете использовать некоторый метод аспектно-ориентированного программирования (AOP) и вводить через postsharp или spring.net имеет движок, который вы можете использовать для перехвата вызовов (что выходит за рамки только контроллера, но вы можете установить регулярное выражение в файле конфигурации для применения, я верю в классы с именем «Контроллер» на них. –

Смежные вопросы