文章出處

如果在 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;
        ....
    }
}

參考資料:


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()