2016-05-16 18 views
2

Stack,служба WebAPI Owin игнорируя ExceptionFilter

По какой-то причине моя служба Owin WebAPI игнорирует наш обработчик исключений. Я следую документации для asp.net exception handling. Вот упрощенные детали реализации (вычищенные фирменные вещи).

Можете ли вы кого-то указать, что я пропускаю?

Пользовательские исключения фильтра:

public class CustomExceptionFilter : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     actionExecutedContext.Response.StatusCode = HttpStatusCode.NotFound; 
     actionExecutedContext.Response.Content = new StringContent("...my custom business...message...here..."); 
    } 
} 

Во время запуска:

var filter = new CustomExceptionFilter(); 
config.Filters.Add(filter); 
appBuilder.UseWebApi(config); 

Тест контроллера:

[CustomExceptionFilter] 
public class TestController: ApiController 
{ 
    public void Get() 
    { 
     throw new Exception(); // This is a simplification. 
           // This is really thrown in buried 
           // under layers of implementation details 
           // used by the controller. 
    } 
} 
+0

У меня есть проект, который делает этот точный шаблон, за исключением OnException, чтобы изменить ответ. Я создаю новый HttpResponseException (новый HttpResponseMessage (...'вместо изменения' actionExecutedContext'. –

ответ

2

Вы можете тр 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()); 
+0

Просьба дать краткий отрывок в контексте ссылок, о которых идет речь, в ваш ответ. Просто указывая ссылку # 1, ссылка № 2 без объяснения непростительна и будет страдать от гниения ссылки или ответа, который будет удален в других ссылках. – t0mm13b

+1

@ t0mm13b, я обновил свой ответ с более полным объяснением. Прошу прощения за первый ответ с таким количеством ссылок. – jumuro

+0

Теперь это намного лучше. – t0mm13b

Смежные вопросы