ASP.NET Web API 異常日志記錄


如果在 ASP.NET MVC 應用程序中記錄異常信息,我們只需要在 Global.asax 的 Application_Error 中添加代碼就可以了,比如:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Error(object sender, EventArgs e)
    {
        var lastError = Server.GetLastError();
        if (lastError != null)
        {
            Logger.Default.Error("Application_Error", lastError);
            Response.StatusCode = 500;
            Server.ClearError();
        }
    }
}

但這一套在 ASP.NET Web API 中並不適用,其解決方式也不是很麻煩,我們先創建 ExceptionHandlingAttribute(繼承 ExceptionFilterAttribute):

public class ExceptionHandlingAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        var exception = context.Exception;
        if (exception != null)
        {
            Logger.Default.Error("Application_Error", exception);
        }
    }
}

然后在 WebApiConfig 中注冊下:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.Filters.Add(new ExceptionHandlingAttribute());

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

或者我們在 Action 上面添加 ExceptionHandlingAttribute 屬性:

public class ValuesController : ApiController
{
    [ExceptionHandlingAttribute]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

如果日志沒有記錄的話,需要在 Global.asax.cs 中的 Application_Start 添加如下代碼:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
        ....
    }
}

參考資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM