2013-06-24 5 views
0

Im создание веб-приложения MVC4. Мое требование состоит в том, чтобы протоколировать длительность выполнения запроса HTTP-метода действия контроллера, используя log4net.MVC4 метод действия регистрации

Я слышал, что предпочтительный способ сделать это - создать пользовательский actionfilter - запустить секундомер в методе onExecuting - затем записать продолжительность в onExecuted.

У меня есть пользовательское связующее устройство, которое выполняет запросы к моим хранилищам, чтобы построить сложные объекты. Поскольку перед использованием фильтров выполняется связывание модели, я не читаю точное считывание продолжительности.

Я мог бы использовать пользовательские HttpModule, но как я знаю, если это маршруты к методу действия или нет ...

EDIT:

Мои действия принимает объект домена клиента в качестве параметра. Я использую custombobject для поиска ключа в URL-адресе и извлечения объекта клиента из своего репо.

Любые идеи?

+0

Ваша модель, связывающая базу данных, является ужасным дизайном, и вы начинаете понимать, почему. Модельное связующее должно связывать только данные, отправленные с клиента. Вам лучше было бы сделать это в ActionFilter, а не в качестве связующего. –

ответ

0

Вы сомневаетесь, что это немного запутывает. Вы хотите отслеживать выполнение действий/результатов или выполнение вложения в виде шрифта. Почему у вас есть связующее устройство, связывающее ваш репозиторий с целью создания объекта? Модельное связующее должно построить объект для типа, указанного в действии HttpPost. Что касается отслеживания действий/результатов, здесь приведена небольшая ссылка, которая может помочь вам определить, что вы хотите отслеживать (если вы хотите отслеживать с помощью фильтров действий).

В MVC вы можете отслеживать, когда действие началось, и когда оно закончилось, и вы также можете отслеживать, когда результат начался, и когда результат закончился.

Первые два варианта реализованы через интерфейс IActionFilter. Этот фильтр требует, чтобы вы реализовали два метода: OnActionExecuting и OnActionExecuted. Первый метод вызывается непосредственно перед началом действия, а последний метод вызывается сразу после завершения действия.

Второй интерфейс касается генерируемого результата. Это реализовано через интерфейс IResultFilter. Он также содержит два метода для реализации. Это OnResultExecuting и OnResultExecuted. Первый метод, OnResultExecuting вызывается после завершения OnActionExecuted. Это тот момент, когда вы результат, допустим, ViewResult начал обработку вывода, который вернется к пользователю. После того, как представление будет готово и возвращено пользователю, выдается OnResultExecuted. Это сообщает вам, что обработка выполнена.

Теперь, что вы хотите зарегистрировать, зависит от вас. Если вам нужно регистрироваться при запуске вашего действия, выполняется вызов базовых источников данных и заканчивается, а затем реализуется IActionFilter. Если вам нужно отслеживать, сколько времени требуется для обработки результата, тогда выполните команду IResultFilter.

Вы также можете реализовать оба фильтра сразу, наследуя от ActionFilterAttribute.