首页 > 技术文章 > .net core 3.1 新增过滤器(Filter)和拦截器(LogInterceptor)

redo 2020-03-18 21:53 原文

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

推荐阅读