2016-11-23 3 views
2

Когда в контроллерах выбрасываются определенные исключения, я хочу поймать эти исключения и сделать дополнительную логику.Обработка ошибок MVC в промежуточном программном обеспечении Owin

Мне удалось достичь этого с помощью пользовательского IExceptionFilter, который добавлен в список глобальных фильтров.

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

 try 
     { 

      await Next.Invoke(context); 
     } 
     catch (AdalSilentTokenAcquisitionException e) 
     { 
      //custom logic 
     } 

Этот фрагмент кода не работает, это выглядит как исключение уже пойманное и обрабатывается в MVC. Есть ли способ пропустить обработку исключений из MVC и позволить промежуточному программному обеспечению поймать исключение?

+0

Возможный дубликат [Как отключить \ * все \ * обработка исключений в ASP.NET Web API 2 (чтобы освободить место для моего собственного)?] (Http://stackoverflow.com/questions/34201527/how-do-i-disable-all-exception-handling-in-asp-net-web-api- 2-to-make-room-for) –

+0

Не дубликат - другой вопрос касается Web API 2, это о MVC Framework. Часть этого ответа (промежуточное ПО OWIN) применима, но механизм отключения обработки ошибок по умолчанию отличается. –

ответ

2

Там нет идеального способа сделать это (что я знаю), но вы можете заменить по умолчанию IExceptionHandler с тем, которая просто передает сообщение об ошибке через к остальной части стеки.

Я сделал some extensive digging об этом, и на данный момент, похоже, нет лучшего способа.

+0

Также см. Http://stackoverflow.com/questions/34201527/how-do-i-disable-all-exception-handling-in-asp-net-web-api-2-to-make-room-for –

+0

Спасибо за ответ, однако я использую MVC, а не Web Api, поэтому я заменил config.Services.Replace (typeof (IExceptionHandler), новый MyExceptionHandler()); с GlobalFilters.Filters.Add (новый MyExceptionHandler()); Таким образом, исключение не обрабатывается в промежуточном программном обеспечении ... Как настроить MyExceptionHandler в MVC? – Identity

+0

@ Идентичность: MVC, как в ASP.NET Core 1.0? Или как в предварительной Core MVC Framework? –

1

Обновление: я нашел более чистый подход, см. Мой обновленный код ниже. При таком подходе вам не нужен настраиваемый фильтр исключений и, самое главное, вам не нужен шаблон локатора службы окружающей среды HttpContext в вашем промежуточном программном обеспечении Owin.

У меня есть рабочий подход в MVC, однако, как-то это не очень удобно, поэтому я был бы признателен за мнение других людей.

Прежде всего, убедитесь, что в GlobalFilters MVC не добавлены обработчики исключений.

Добавить этот метод к глобальной asax:

protected void Application_Error(object sender, EventArgs e) 
    { 
     var lastException = Server.GetLastError(); 
     if (lastException != null) 
     { 
      HttpContext.Current.GetOwinContext().Set("lastException", lastException); 
     } 
    } 

Промежуточное программное обеспечение, что rethrows за исключением

public class RethrowExceptionsMiddleware : OwinMiddleware 
{ 
    public RethrowExceptionsMiddleware(OwinMiddleware next) : base(next) 
    { 
    } 

    public override async Task Invoke(IOwinContext context) 
    { 
     await Next.Invoke(context); 
     var exception = context.Get<Exception>("lastException"); 
     if (exception != null) 
     { 
      var info = ExceptionDispatchInfo.Capture(exception); 
      info.Throw(); 
     } 
    } 
} 
Смежные вопросы