1. 安装NuGet包
<1>AspectCore.Core
<2>AspectCore.Extensions.DependencyInjection
2.创建特性拦截器
例如:异常拦截器
/// <summary>
/// 异常拦截器
/// </summary>
public class ErrorTryCatchAttribute: AbstractInterceptorAttribute
{
[HandleProcessCorruptedStateExceptions]
public override async Task Invoke(AspectContext context, AspectDelegate next)
{
try
{
await context.Invoke(next);
}
catch (AccessViolationException ex)
{
context.ReturnValue = "404";
}
catch (Exception ex)
{
context.ReturnValue = "404";
}
}
}
3.如何使用拦截器。
(1).把Startup类下的ConfigureServices 这个函数修改为如下:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddControllersAsServices();//拦截器只会拦截从服务注册的接口,所以AddControllersAsServices()必须添加
var serviceContainer = services.ToServiceContainer();//容器
return serviceContainer.Build();
}
(2).注入全局拦截器,在上面的代码中添加全局配置,修改完成后如下
public IServiceProvider ConfigureServices(IServiceCollection services)
{
//根据属性注入来配置全局拦截器
services.ConfigureDynamicProxy(config =>
{
config.Interceptors.AddTyped<Attribute.ErrorTryCatchAttribute>();//Attribute.ErrorTryCatchAttribute这个是需要全局拦截的拦截器
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddControllersAsServices();
var serviceContainer = services.ToServiceContainer();
return serviceContainer.Build();
}
(3).如果该拦截器不需要全局拦截的化,这个位置就不需要添加上面的全局配置,只需要在需要拦截的函数上面打上对应的特性标签,例如该异常拦截器
[HttpGet("{id}")]
[Attribute.ErrorTryCatch]//这里打上该标签就会进行拦截
public virtual ActionResult<string> Get(int id) //virtual,函数必须使用此装饰词,属性注入才会有效
{
return "value";
}