1.三个类的代码放下面(可复制)
2.ActionFilters
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
namespace xx(更改一下命名空间)
{
public class ActionFilters:ActionFilterAttribute
{
private readonly ILogger<ActionFilters> _logger;
public ActionFilters(ILogger<ActionFilters> logger)
{
_logger = logger;
}
/// <summary>
/// 执行方法之前
/// </summary>
/// <param name="context"></param>
public override void OnActionExecuting(ActionExecutingContext context)
{
_logger.LogDebug("执行方法之前");
base.OnActionExecuting(context);
}
/// <summary>
/// 执行方法之后
/// </summary>
/// <param name="context"></param>
public override void OnActionExecuted(ActionExecutedContext context)
{
_logger.LogDebug("执行方法之后");
base.OnActionExecuted(context);
}
/// <summary>
/// 返回值之前
/// </summary>
/// <param name="context"></param>
public override void OnResultExecuting(ResultExecutingContext context)
{
_logger.LogDebug("返回值之前");
base.OnResultExecuting(context);
}
/// <summary>
/// 返回值之后
/// </summary>
/// <param name="context"></param>
public override void OnResultExecuted(ResultExecutedContext context)
{
_logger.LogDebug("返回值之后");
base.OnResultExecuted(context);
}
}
}
3.ExceptionFilters
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Logging;
namespace xx(更改一下命名空间)
{
/// <summary>
/// 异常拦截器
/// </summary>
public class ExceptionFilters :ExceptionFilterAttribute
{
private readonly ILogger<ExceptionFilters> _logger;
public IModelMetadataProvider ModelMetadata { get; }
public ExceptionFilters(ILogger<ExceptionFilters> logger,IModelMetadataProvider modelMetadata)
{
_logger = logger;
ModelMetadata = modelMetadata;
}
/// <summary>
/// 当方法异常时进入
/// </summary>
/// <param name="context"></param>
public override void OnException(ExceptionContext context)
{
if (!context.ExceptionHandled)
{
//添加到日志
_logger.LogError(context.Exception.Message);
//返回的数据
//new{ 自定义 = false,自定义=context.Exception.Message 报错信息}里面的值对应你原本方法返回的数据类型的属性名
context.Result = new JsonResult(new{ success = false,msg=context.Exception.Message});
//终端式(跑到这里结束)
}
base.OnException(context);
}
}
}
4.ResultFilters
using System;
using System.Web.Mvc;
namespace xx(更改一下命名空间)
{
public class ResultFilters : FilterAttribute, IResultFilter
{
void IResultFilter.OnResultExecuting(ResultExecutingContext filterContext)
{
//执行完action后跳转前执行
throw new NotImplementedException();
}
void IResultFilter.OnResultExecuted(ResultExecutedContext filterContext)
{
//执行完action后跳转后执行
throw new NotImplementedException();
}
}
}
5.指定方法拦截[TypeFilter(typeof(对应的拦截器类名))](在运行时会自动进入对应方法)
6.指定控制器拦截[TypeFilter(typeof(对应的拦截器类名))]相当于该控制器中所有方法都添加拦截器特性
7.全局控制器中的所有方法添加拦截器(Startup类的ConfigureServices方法体中把拦截器添加到服务之中)
#region 拦截器-全局
services.AddControllersWithViews(configure =>
{
configure.Filters.Add<ActionFilters>();
});
添加到全局就会每个控制器中方法都能实现拦截器的方法了