Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Изменить: Нашел. Это был этот вопрос.

Ответ 2

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

Что-то вроде

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

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

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

Ответ 3

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