.net core 3.1 新增過濾器(Filter)和攔截器(LogInterceptor)


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


免責聲明!

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



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