Я ищу простое решение для ведения журнала исключений в сочетании с обработкой ошибок в приложении ASP.Net MVC 1.0.
Я прочитал много статей, в том числе вопросы, размещенные здесь в StackOverflow, которые предоставляют различные решения для разных ситуаций. Я по-прежнему не в состоянии найти решение, соответствующее моим потребностям.
Вот мои требования:
-
Чтобы иметь возможность использовать атрибут [HandleError] (или что-то подобное) на моем контроллере, обрабатывать все исключения, которые могут быть выбраны из любого из Actions или Views. Это должно обрабатывать все исключения, которые не были обработаны специально для любого из действий (как описано в пункте 2). Я хотел бы иметь возможность указать, какой вид пользователя должен быть перенаправлен пользователю в случаях ошибок, для всех действий в контроллере.
-
Я хочу, чтобы указать атрибут [HandleError] (или что-то подобное) в верхней части определенных действий, чтобы поймать определенные исключения и перенаправить пользователей в представление, соответствующее исключению. Все остальные исключения по-прежнему должны обрабатываться атрибутом [HandleError] на контроллере.
-
В обоих случаях выше, я хочу, чтобы исключения регистрировались с использованием log4net (или любой другой библиотеки журналов).
Как я могу достичь вышеуказанного? Я читал о том, что все мои контроллеры наследуются от базового контроллера, который переопределяет метод OnException и в котором я выполняю регистрацию. Однако это будет беспорядочно перенаправлять пользователей на соответствующие виды или сделать их грязными.
Я читал о написании своего собственного действия фильтра, которое реализует IExceptionFilter, чтобы справиться с этим, но это будет противоречить атрибуту [HandleError].
До сих пор я думал, что лучшим решением является написать мой собственный атрибут, который наследуется от HandleErrorAttribute. Таким образом, я получаю все функциональные возможности [HandleError] и могу добавить свой собственный журнал log4net. Решение выглядит следующим образом:
public class HandleErrorsAttribute: HandleErrorAttribute {
private log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception != null)
{
log.Error("Error in Controller", filterContext.Exception);
}
base.OnException(filterContext);
}
}
Будет ли приведенный выше код работать для моих требований? Если нет, какое решение удовлетворяет моим требованиям?