Вы можете тр y для реализации Global Error Handling in ASP.NET Web API 2. Таким образом вы получите глобальный обработчик ошибок для промежуточного программного обеспечения Web API, но не для других посредников в конвейере OWIN, например, для авторизации.
Если вы хотите внедрить промежуточное программное обеспечение для обработки ошибок globlal, ссылки , this и this могут вас заинтересовать.
Надеюсь, это поможет.
EDIT
Что касается на комментарий @ t0mm13b, я дам немного объяснение, основанное на первой this ссылке с Khanh TO.
Для обработки глобальных ошибок вы можете написать обычное и простое промежуточное программное обеспечение, которое просто передает поток выполнения в следующее промежуточное программное обеспечение в конвейере, но внутри блока try
.
Если есть необработанное исключение в одном из следующих промежуточных программных в трубопроводе, он будет захвачен в catch
блоке:
public class GlobalExceptionMiddleware : OwinMiddleware
{
public GlobalExceptionMiddleware(OwinMiddleware next) : base(next)
{ }
public override async Task Invoke(IOwinContext context)
{
try
{
await Next.Invoke(context);
}
catch (Exception ex)
{
// your handling logic
}
}
}
В методе Startup.Configuration()
, добавьте промежуточное программное обеспечение, в первую очередь к трубопроводу если вы хотите обрабатывать исключения для всех других посредников.
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use<GlobalExceptionMiddleware>();
//Register other middlewares
}
}
Как указано на Tomas Lycken во втором this ссылке, вы можете использовать это для обработки исключений, генерируемых в Web API промежуточного программного обеспечения, создавая класс, который реализует IExceptionHandler
, что просто бросает захваченное исключение, таким образом, глобальный обработчик исключений промежуточного воли поймать его:
public class PassthroughExceptionHandler : IExceptionHandler
{
public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
{
// don't just throw the exception; that will ruin the stack trace
var info = ExceptionDispatchInfo.Capture(context.Exception);
info.Throw();
}
}
И не забудьте заменить IExceptionHandler
во время конфигурации Web API промежуточного программного обеспечения:
config.Services.Replace(typeof(IExceptionHandler), new PassthroughExceptionHandler());
У меня есть проект, который делает этот точный шаблон, за исключением OnException, чтобы изменить ответ. Я создаю новый HttpResponseException (новый HttpResponseMessage (...'вместо изменения' actionExecutedContext'. –