背景
我正在爲客戶端開發API服務層,並且我被要求捕獲並記錄全局錯誤。如何爲C#MVC4 WebAPI應用程序全局記錄所有異常?
因此,儘管像一個未知的終結點(或行爲)很容易通過使用ELMAH或通過添加像這樣的Global.asax
處理:
protected void Application_Error()
{
Exception unhandledException = Server.GetLastError();
//do more stuff
}
。 。與路由無關的未處理的錯誤不會被記錄。例如:
public class ReportController : ApiController
{
public int test()
{
var foo = Convert.ToInt32("a");//Will throw error but isn't logged!!
return foo;
}
}
我自己也嘗試通過註冊該過濾器全局設置[HandleError]
屬性:
filters.Add(new HandleErrorAttribute());
但也不會記錄所有的錯誤。
問題/疑問
如何截取喜歡通過調用/test
上面,這樣我就可以登錄他們產生一個錯誤?看起來這個答案應該是顯而易見的,但我已經嘗試了迄今爲止我能想到的一切。
理想情況下,我想添加一些東西到錯誤日誌記錄中,例如請求用戶的IP地址,日期,時間等等。我也希望能夠在遇到錯誤時自動發送電子郵件給支持人員。所有這些我都可以做,只要我能在發生這些錯誤時攔截這些錯誤!
已解決!
感謝Darin Dimitrov,我接受了他的回答,我弄明白了。 WebAPI不會不是以與常規MVC控制器相同的方式處理錯誤。
這裏是什麼工作:
1)添加自定義過濾器,您的命名空間:
public class ExceptionHandlingAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is BusinessException)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent(context.Exception.Message),
ReasonPhrase = "Exception"
});
}
//Log Critical errors
Debug.WriteLine(context.Exception);
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent("An error occurred, please try again or contact the administrator."),
ReasonPhrase = "Critical Exception"
});
}
}
2)現在全球註冊過濾器在WebApiConfig類:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional });
config.Filters.Add(new ExceptionHandlingAttribute());
}
}
或你可以跳過註冊,只是裝飾一個單控制器與[ExceptionHandling]
屬性。
我有同樣的問題。未處理的異常會被捕獲到異常過濾器屬性中,但是當我拋出一個新的異常時,它不會被異常過濾器屬性捕獲,對此有什麼想法? – daveBM 2013-11-05 11:54:02
未知的API控制器調用像http:// myhost/api/undefinedapicontroller錯誤仍未捕獲。 Application_error和Exception過濾器代碼不會被執行。如何抓住他們呢? – Andrus 2013-11-26 09:03:37
全局錯誤處理已添加到WebAPI v2.1。請參閱我的回覆:http:// stackoverflow。com/questions/17449400/how-do-i-set-up -a-global-error-handler-in-webapi/21264726#21264726 – DarrellNorton 2014-01-21 17:13:35