2017-01-05 5 views
1

Как обрабатывать глобальную обработку исключений для моих методов контроллера в веб-API без состояния? Моя цель - избегать многословности заявлений try/catch внутри моего контроллера.Глобальная обработка ошибок в службе Fabric Webeless API

Я смог добиться этого с помощью веб-API, поддерживающего IIS, с помощью пользовательского ExceptionHandler, который я зарегистрировал в своем WebAPIConfig.cs. Это не будет работать прямо в летучей мыши в хостинговом API OWIN (например, в Service Fabric). Поэтому в веб-API SF stateless я создал промежуточное ПО Owin и зарегистрировал это промежуточное ПО в Startup.cs, но он не работает. Блок catch игнорируется в конвейере ответа в моем промежуточном коде.

...

public override async Task Invoke(IOwinContext context) 
{ 
    try 
    { 
     //It goes here 
     await Next.Invoke(context); 
    } 
    catch (Exception ex) 
    { 
     //This catch block does not get called???? 
     HandleException(ex, context); 
    } 
} 
+0

Вы ** можете использовать пользовательский 'ExceptionLogger/Handler' (не имеет значения для самостоятельного размещения или размещения IIS) –

ответ

0

После многих рытье решений, так как там было довольно много подобных любыми вопросами там, я получил лучшее представление о веб-API и трубопровода Owin. Этот вопрос здесь, в SO, предоставил мне много информации: Disable *all* exception handling in ASP.NET Web API 2 (to make room for my own)?

Исключенные исключения Web API обрабатываются по умолчанию, и это означает, что исключение обрабатывается, поэтому оно не распространяется на стек. И именно по этой причине блок catch выше (из моего размещенного вопроса) не вызван. Для того чтобы его получить называется, мне нужно заменить IException обработчик веб-API (в startup.cs) через это:

config.Services.Replace(typeof(IExceptionHandler), new PassthroughExceptionHandler()); 

Все это пользовательский обработчик делает вперед исключение вниз по стеку и пусть Owin глобальной исключение промежуточного слоя делает работу.

PassthroughExceptionHandler реализуется следующим образом:

public class PassthroughExceptionHandler : IExceptionHandler 
{ 
    public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) 
    { 
     var info = ExceptionDispatchInfo.Capture(context.Exception); 
     info.Throw(); 
    } 
} 

Обратите внимание, что это использует ExceptionDispatchInfo. Существуют и другие решения, которые имеют разную реализацию, но до сих пор это обеспечивало мне то, что мне нужно, что должно привести к тому, чтобы исключить исключение из моей общей модели ответов на ошибки в моем OwinGlobalExceptionHandler.