У меня есть приложение с обоими сосуществующими конечными точками MVC и «новым» ApiController в ASP.NET Core 2.2.
До добавления конечных точек API я использовал глобальный обработчик исключений, зарегистрированный в качестве промежуточного программного обеспечения с использованием app.UseExceptionHandler((x) => { ... }
, который перенаправлял бы на страницу с ошибкой.
Конечно, это не работает для ответа API, и я хотел бы вернуть ObjectResult
(согласованный) 500
результат с ProblemDetails
отформатированным результатом.
Проблема в том, что я не уверен, как надежно определить в моей лямбде UseExceptionHandler, имею ли я дело с MVC или запросом API. Я мог бы использовать какое-то соответствие URL запроса (например, /api/...
prefix), но я хотел бы более надежное решение, которое не вернется, чтобы укусить меня в будущем.
Грубая версия псевдо-кода, которую я пытаюсь реализовать:
app.UseExceptionHandler(x =>
{
x.Run(async context =>
{
// extract the exception that was thrown
var ex = context.Features.Get<IExceptionHandlerFeature>()?.Error;
try
{
// generically handle the exception regardless of what our response needs to look like by logging it
// NOTE: ExceptionHandlerMiddleware itself will log the exception
// TODO: need to find a way to see if we have run with negotiation turned on (in which case we are API not MVC!! see below extensions for clues?)
// TODO: ... could just use "/api/" prefix but that seems rubbish
if (true)
{
// return a 500 with object (in RFC 7807 form) negotiated to the right content type (eg. json)
}
else
{
// otherwise, we handle the response as a 500 error page redirect
}
}
catch (Exception exofex)
{
// NOTE: absolutely terrible if we get into here
log.Fatal($"Unhandled exception in global error handler!", exofex);
log.Fatal($"Handling exception: ", ex);
}
});
});
}
Есть идеи?
Ура!