У меня есть глобальный фильтр исключений с именем LogErrorAttribute
:
public class LogErrorAttribute : IExceptionFilter
{
private ILogUtils logUtils;
public void OnException(ExceptionContext filterContext)
{
if (this.logUtils == null)
{
this.logUtils = StructureMapConfig.Container.GetInstance<ILogUtils>();
}
this.logUtils.LogError(HttpContext.Current.User.Identity.GetUserId(), "Unknown error.", filterContext.Exception);
}
}
Он зарегистрирован вместе со стандартным фильтром HandleErrorAttribute
:
filters.Add(new LogErrorAttribute());
filters.Add(new HandleErrorAttribute());
Я регистрирую эти фильтры следующим образом:
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
У меня также есть резерв Application_Error
:
protected void Application_Error()
{
var exception = Server.GetLastError();
Server.ClearError();
var httpException = exception as HttpException;
//Logging goes here
var routeData = new RouteData();
routeData.Values["controller"] = "Error";
routeData.Values["action"] = "Index";
if (httpException != null)
{
if (httpException.GetHttpCode() == 404)
{
routeData.Values["action"] = "NotFound";
}
Response.StatusCode = httpException.GetHttpCode();
}
else
{
Response.StatusCode = 500;
}
// Avoid IIS7 getting involved
Response.TrySkipIisCustomErrors = true;
// Execute the error controller
if (exception != null)
{
this.errorLogger.Log(LogLevel.Error, "An unknown exception has occurred.", exception);
}
else if (httpException != null)
{
this.errorLogger.Log(LogLevel.Error, "An unknown HTTP exception has occurred.", httpException);
}
else
{
this.errorLogger.Log(LogLevel.Error, "An unknown error has occurred.");
}
}
Теперь у меня есть контроллер API, который захватывает некоторые данные из базы данных, а затем использует AutoMapper
для сопоставления моделей для просмотра моделей:
var viewModels = AutoMapper.Mapper.Map(users, new List<UserViewModel>());
Внутри этой конфигурации AutoMapper
пользовательский резольвер выполняет одно из свойств:
var appModuleAssignments = this.appModuleAssignmentManager.Get(userId);
var appModules = appModuleAssignments.Select(x => this.appModuleManager.Get(x.AppModuleId));
return AutoMapper.Mapper.Map(appModules, new List<AppModuleViewModel>());
В настоящий момент я заставляю оператор appModuleManager.Get
генерировать регулярное исключение:
throw new Exception("Testing global filter.");
Это впоследствии выдает исключение в AutoMapper
, оба из которых необработаны, однако ни глобальный фильтр, ни Application_Error
не собирают это исключение.
Что я сделал здесь неправильно?
Несколько вещей, которые я сделал с момента публикации:
- Добавлен атрибут
customErrors
вWeb.config
, чтобы включить ихon
. - Удален глобальный фильтр
HandleErrorAttribute
, потому что я понял, что он установил ошибку для обработки, если она была даже запущена. Я бы не ожидал, что он будет выполняться в любом случае, потому что эта ошибка происходит за пределами контроллера, но, скорее всего, это меня убьет позже.