2013-07-03 88 views
6

我正在構建一個.NET WebApi應用程序,我想設置一個全局錯誤處理程序(基本上是一個函數,當異常從應用程序中的任何地方冒出來時執行)。 this link對此表示支持,但提供了幾種解決方法。不幸的是,我似乎無法找到任何有用的文檔。如何在WebApi中設置全局錯誤處理程序?

這裏是我的要求:

  • 捕獲例外的操作方法,以及在其他地方打(例如控制器分辨率。)。
  • 在我的處理過程中有權訪問原始的Exception對象。
  • 在錯誤處理過程中,我可以訪問我的(Autofac)IOC容器中的服務(這是一個強烈的需求,但不是必須的)。
  • 不依賴於MVC(我正在使用純WebApi)。不需要依賴於IIS。

我該如何解決這個問題?

回答

0

有你應該知道的幾個選項:

事件AppDomain.CurrentDomain.FirstChanceException

將觸發每一個例外,無論它是否被處理。在你的特定處理程序之前使用它來記錄日誌

事件AppDomain.CurrentDomain.UnhandledException

將觸發對代碼沒有處理每個異常

您需要在有你的IOC容器等

+0

請問UnhandlesExceptionHandler Web服務器上運行時的實際工作或做拋出的異常得到由底層服務器吞噬? – ChaseMedallion

+0

從我的測試中,UnhandledException處理程序從來沒有真正運行......好像底層服務器在某處捕獲異常。 – ChaseMedallion

+0

我承認我沒有在WebApi中試過。對不起,這沒有爲你工作。你有沒有考慮過像ELMAH https://code.google.com/p/elmah/。這提供了非常廣泛的異常記錄。這裏是一篇文章如何整合http://www.tugberkugurlu.com/archive/asp-net-web-api-and-elmah-integration – user2509738

7

如果更新訪問的服務來創建處理程序到Web API v2.1,可通過Nuget使用此命令:

Install-Package Microsoft.AspNet.WebApi 

您可以通過從Exception Logger繼承來創建一個全局異常處理程序。

下面是一個例子:

class TraceExceptionLogger : ExceptionLogger 
{ 
    public override void LogCore(ExceptionLoggerContext context) 
    { 
     Trace.TraceError(context.ExceptionContext.Exception.ToString()); 
    } 
} 

更多細節在發佈說明:http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#global-error

+0

任何想法,如果這也可以用於MVC應用程序? – gldraphael

+1

你應該發佈完整的解決方案,而不是鏈接到一個頁面。這仍然需要調用:'config.Services。添加(typeof(IExceptionLogger),新的TraceSourceExceptionLogger(新的TraceSource(「MyTraceSource」,SourceLevels.All)));' – makhdumi