Как я могу перехватить все вызовы контроллера в приложении MVC? - PullRequest
14 голосов
/ 21 февраля 2012

Существует ли быстрый метод перехвата всех вызовов контроллера в MVC-3?

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

Ответы [ 4 ]

22 голосов
/ 21 февраля 2012

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

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

Я сейчас посмотрю, смогу ли я найти источник.

Редактировать: Нашел. Это был этот вопрос .

5 голосов
/ 21 февраля 2012

В зависимости от того, насколько большой сайт уже существует, вы можете создать класс в иерархии между классом 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 голосов
/ 22 февраля 2012

Вы можете использовать свой собственный завод-изготовитель контроллеров и зарегистрировать его также: 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));
1 голос
/ 21 февраля 2012

есть отладчик маршрутизации, разработанный Филом Хааком

ASP.Net Routing Debugger

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