Как правильно регистрировать каждое исключение с помощью 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, но мне не нужны их облачные функции, и это определенно не стоит платить сотни долларов в год, чтобы регистрировать некоторые исключения.
Каким должен быть лучший способ зарегистрировать любое возможное исключение, брошенное моим приложением?
Спасибо за помощь
Ответы
Ответ 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)
надеюсь, что эта помощь