Я хочу связать обработку исключений в компоненте промежуточного программного обеспечения, примерно так:
public override async Task Invoke(IOwinContext context)
{
try
{
await Next.Invoke(context);
}
catch (Exception ex)
{
// Log error and return 500 response
}
}
Однако некоторые из исключений, которые я хотел бы поймать, будут пойманы и конвертированы в HttpErrorResponse
конвейером веб-API, прежде чем я смогу добраться до них. В этом процессе я теряю много деталей об ошибках, поэтому я не могу получить полезные трассировки стека при отладке и т.д. (Отладчик даже не останавливается, когда генерируется исключение - мне нужно вручную выполнить код и посмотреть где он терпит неудачу...).
Я попробовал добавить настраиваемый обработчик исключений со следующей реализацией:
public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
{
var owinContext = context.Request.GetOwinContext();
owinContext.Set(Constants.ContextKeys.Exception, context.Exception);
return Task.FromResult(0);
}
зарегистрировался через config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());
в моей конфигурации запуска, но посмотрел на него после выполнения Next.Invoke(context)
через
context.Get<Exception>(Constants.ContextKeys.Exception);
все еще не дает мне все детали, которые я хочу, а также не могу остановиться в точке сбоя с помощью отладчика.
Есть ли способ полностью отключить встроенную обработку ошибок, чтобы мое собственное промежуточное ПО могло позаботиться об этом?
Уточнение, поскольку многие люди, похоже, неправильно понимают, что мне нужно:
- Встроенная обработка ошибок в веб-интерфейсе позволяет получить некоторые (но не все) исключения и переписать их на 500 ответов.
- Я хочу поймать все исключения, сделать некоторые записи, а затем исправить 500 ответов с информацией, которую я выбираю (для большинства из них см. следующий маркер).
- Есть также некоторые исключения, которые приводят к ошибкам бизнес-логики, для которых я хочу вернуть 40x ошибок.
- Я хочу, чтобы это было в верхней части (app) конвейера, то есть обертывания всего остального в жизненном цикле запроса
- Я хочу обработать это с помощью OWIN, чтобы сделать его переносимым для будущего будущего самостоятельного сценария (т.е. не написано на камне, что это приложение всегда будет размещаться на модулях IIS - HTTP, Global.asax.cs и др. здесь не актуальны).