[.NET] 在WebAPI中使用AOP的方式,控制器中加入Attribute集中進行例外狀態的處理

在編寫WebAPI時,若是在每一個控制器中都必須加入例外狀態的處理,是一件很麻煩又很難進行程式碼的管理
透過在控制器上加入Attribute,也就是採用AOP(Aspect-Oriented Programming)的處理,就可以統一進行例外狀態的管理與程式碼的編寫

要在WevAPI控制器中加入共用例外狀態處理的AOP程式碼很簡單,幾個步驟就可以完成了

首先先在程式碼專案中,加入一個ExceptionHandle.cs的類別庫

接著將下面的程式碼加入至該類別庫之中

using System.Web.Http.Filters;
using System.Net;
using System.Net.Http;

public class ExceptionHandle : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is NotImplementedException)
        {
            // 尚未實作的例外狀態
            context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
        }
        else
        {
            // 其他的狀態,回傳400的Status Code
            context.Response = new HttpResponseMessage(HttpStatusCode.BadRequest);
        }
    }
}

在這段程式碼之中,主要的目的是繼承ExceptionFilterAttribute的類別,並覆寫OnException的副程式
在覆寫的內容中,我先加入一個判斷,判斷尚未實作與其他例外狀態時,會回傳不同的HttpStatusCode

只要這一個類別庫放在專案中,就可以透過Attribute的方式引入至WebAPI的控制器上
所以當WebAPI的控制器中,加入[ExceptionHandle]的Attribute後,就可以直接攔截到例外狀態的訊息,並加以處理了

[ExceptionHanlde]
public string Get(int id)
{
    var strValues = new string[] { "1", "2" };
    return strValues[2];
}

這段程式碼是我故意定義長度為2的字陣列,但是硬要回傳第三個位置的字串

當發生例外狀態的時候,OnException就會攔截並取得例外訊息的內容

而測試REST API的工具,也會得到HttpStatusCode為400的錯誤訊息

透過繼承ExceptionFilterAttribute與覆寫OnException的方式,在控制器中加入對應的Attribute,很容意的就可以達到統一管理例外狀態的功能,也可以大幅降低編寫例外處理程式碼的程式碼數量了

範例程式下載:
https://github.com/madukapai/maduka-WebAPI