Asp.net-Web-Api
將 Web Api 2.2 中的 IExceptionHandler 替換為 OWIN 中間件異常處理程序
我創建了一個 OWIN 中間件來擷取異常。中間件實際上什麼都不做,只是像這樣用 try catch 包裝下一個呼叫
try { await _next(environment) } catch(Exception exception){ // handle exception }問題是中間件沒有擷取異常,因為異常是由 IExceptionHandler 的預設實現處理的,它返回一個帶有堆棧跟踪的 xml。
我知道我可以用自己的 IExceptionHandler 實現替換預設的 IExceptionHandler 實現,但我想要的是讓 OWIN 中間件獲得控制權,並且這個預設的異常處理程序被忽略或替換為 OWIN 中間件
更新:
我已將以下答案標記為答案,儘管它更像是一個 hack,但我真的相信沒有 hack 就無法實現這一點,因為 WebApi 異常永遠不會被 OWIN 中間件擷取,因為 Web API 處理自己的異常,而 OWIN中間件處理在中間件中引發但未被這些中間件處理/擷取的異常
在這個答案中製作一個“ExceptionHandler:IExceptionHandler” 。然後在 HandleCore 中,將該異常放入 OwinContext:
public void HandleCore(ExceptionHandlerContext context) { IOwinContext owinContext = context.Request.GetOwinContext(); owinContext.Set("exception", context.Exception); }然後在您的中間件中,檢查環境是否包含“異常”鍵。
public override async Task Invoke(IOwinContext context) { await Next.Invoke(context); if(context.Environment.ContainsKey("exception")) { Exception ex = context.Environment["exception"]; // Do stuff with the exception } }