Подтвердить что ты не робот

Как правильно регистрировать каждое исключение с помощью OWIN

мой вопрос должен быть довольно простым, но, к сожалению, мне не повезло в его решении.

В принципе, у меня есть несколько контроллеров Web API, размещенных OWIN и развернутых на Azure.

Мне действительно нужно отслеживать исключения, возникающие в каждом промежуточном программном обеспечении (например, OAuthAuthorizationServerProvider или SignalR Persistent Connections), но я определенно не знаю, как его достичь.

  • Я пробовал Elmah, но он не работает должным образом с OWIN из-за отсутствия HttpContext.
  • Я попытался использовать log4net, но я могу только регистрировать исключения, брошенные контроллерами веб-API, используя специальный ExceptionFilterAttribute.. другие игнорируются.
  • Я попытался определить пользовательский LoggerFactory и назначить его в Startup, используя app.SetLoggerFactory(new MyLoggerFactory()), но исключение, созданное другими посредниками, не регистрируется.
  • Я попытался получить хотя бы значимое сообщение об ошибке, отправленное клиенту, но, несмотря на <customErrors mode="Off"/> и <deployment retail="false"/>, Azure отказывается возвращать что-либо, кроме {"message":"an error has occurred"}. Я пробовал как Azure Web Sites, так и Azure Cloud Services.
  • Я видел некоторые облачные альтернативы, которые должны работать с OWIN, такими как Elmah.io или Raygun.io, но мне не нужны их облачные функции, и это определенно не стоит платить сотни долларов в год, чтобы регистрировать некоторые исключения.

Каким должен быть лучший способ зарегистрировать любое возможное исключение, брошенное моим приложением?

Спасибо за помощь

4b9b3361

Ответ 1

Вы можете посмотреть эту ссылку? http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

Поскольку вы не можете поймать все исключения с помощью exceptionFilter, они предлагают использовать IExceptionLogger и IExceptionHandler, чтобы разрешить глобальную обработку ошибок в Web Api 2.

После этого, если это не соответствует вашим потребностям, вы можете создать OwinMiddleWare, который вы разместите в первой позиции (до этапа Authenticate), это промежуточное ПО могло бы:

  • создать requestId в заголовке ответа
  • проанализируйте код ответа, прежде чем отправлять ответ, и если он не является кодом IsSuccessStatusCode, вы можете записать сообщение об исключении в БД и заменить содержимое ответа, чтобы отправить клиенту простое сообщение об ошибке с помощью requestId (чтобы разрешить вы найдете соответствующее исключение в своем db)

надеюсь, что эта помощь