webapi 項目中,如果需要統一監控或過濾,常用的是借助過濾器 Filter 或攔截器 AOP ,本次我接入了全局的ActionFilter以及ExceptionFilter,以及LogInterceptor。本來還嘗試接入AOP框架AspectCore ,不過沒調通,先不細說了。
Filter總共有五種,Authorization Filter,Resource Filter,Exception Filter,Action Filter,Result Filter
本文我只記錄了Exception Filter,Action Filter
Exception Filter 設置
新增全局異常過濾器GlobalExceptionFilter.cs,
當出現異常時進入此方法,可在這針對不同的異常做相關處理並返回指定數據,避免直接把錯誤暴露給用戶
public class GlobalExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
Exception ex = context.Exception;
string errMsg = "GlobalExceptionFilter-OnException:" + ex.Message;
if (context.Exception.GetType() == typeof(ExecuteException))
{
//針對不同的自定義異常,做不同處理
MsgModel<string> msgModel = new MsgModel<string>()
{
Status = false,
Msg = errMsg,
Errcode = "AA001"
};
context.Result = new JsonResult(msgModel);
context.ExceptionHandled = true;
}
else
{
context.Result = new JsonResult(errMsg);
context.ExceptionHandled = true;
}
LogHelper.Error(errMsg);
}
}
然后在Startup.cs 注入過濾器

上面那個AddJsonOptions 是為了解決 JsonResult 中文亂碼問題,因為我發現捕獲異常后返回中文會亂碼
Action Filter 設置
新增全局過濾器GlobalActionFilter.cs
在方法執行前后,會跳轉至以下兩個方法,方便追蹤接口執行情況
public class GlobalActionFilter : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
//LogHelper.Info("OnActionExecuted");
//執行方法后執行這
}
public void OnActionExecuting(ActionExecutingContext context)
{
//LogHelper.Info("OnActionExecuting");
//執行方法前先執行這
}
}
注入方法同上圖
以上是兩個過濾器的示例,可針對不同需求選用
LogInterceptor 設置
安裝Castle.Core,Autofac.Extras.DynamicProxy
新建LogInterceptor.cs ,繼承IInterceptor
public class LogInterceptor: IInterceptor
{
public void Intercept(IInvocation invocation)
{
try
{
invocation.Proceed();
Dapper.Logger.LogHelper.logger.Info(invocation.Method.Name);
}
catch (Exception ex)
{
Dapper.Logger.LogHelper.logger.Error(invocation.Method.Name+ " " + ex.ToString());
}
}
}
在Startup.cs 新增以下代碼

Filter和 LogInterceptor 可以同時共存,執行順序是:
ActionFilter 的OnActionExecuting =》LogInterceptor 的Intercept =》ActionFilter 的OnActionExecuted
如果接口有異常,不會跳轉LogInterceptor ,而是進入ExceptionFilter,順序是:
ActionFilter 的OnActionExecuting =》ActionFilter 的OnActionExecuted =》ExceptionFilter 的OnException
