.Net6自定义拦截器
拦截器是Aop(面向切面编程)的思想指的是不改变原代码封装的前提下去实现更多功能
这里通过.net的特性(给一个目标对象添加一段配置信息)的方式去实现拦截器功能
新建一个特性
namespace CorePolly { public class TestAttribute: Attribute { public string Name { get; set; } public string Value { get; set; } public string Data { get; set; } public TestAttribute(string name,string value, string data) { Name = name; Value = value; Data = data; } } }
再新建一个自定义拦截器的类 继承 IInterceptor 并实现 Interceptor 方法
using Castle.DynamicProxy; using System.Reflection; namespace CorePolly { [AttributeUsage(AttributeTargets.Method)] public class TestPolicyInterceptor : Attribute, IInterceptor { public void Intercept(IInvocation invocation) { TestAttribute pollyPolicyConfigAttribute = invocation.Method.GetCustomAttribute<TestAttribute>()!; Console.WriteLine($@"我是自定义拦截器名称是:{pollyPolicyConfigAttribute.Name}"); } } }
然后定义一个IService 和 Service 提供相应的服务
using Autofac.Extras.DynamicProxy; using Microsoft.AspNetCore.Routing; namespace CorePolly.IService { [Intercept(typeof(TestPolicyInterceptor))] public interface IUserService { [TestAttribute("我是自定义拦截器","value","data")] User AOPGetById(int id); [TestAttribute("我是自定义拦截器", "value", "data")] public string GetById(int id); } public record User(int Id, string Name, string Account, string Password); }
using CorePolly.IService; namespace CorePolly.Service { public class UserServiceBy: IUserService { public string AOPGetById(int id) {return id.ToString(); } public string GetById(int id) { return id.ToString(); } } }
然后在controllers中调用
using CorePolly.IService; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Polly; using System.Net; namespace CorePolly.Controllers { [Route("api/[controller]/[action]")] [ApiController] public class HomeController : ControllerBase { private readonly IUserService _userService; public HomeController(IUserService userService) { _userService = userService; } public IActionResult GetFunction() { _userService.AOPGetById(11);
Console.WriteLine("123"); return Ok("123"); } public IActionResult Get() {
Console.WriteLine("123"); return new ObjectResult("111") { StatusCode = 500, Value = "Home" }; }
}
}
最后再porgram中依赖注入一下
using CorePolly; using CorePolly.IService; using CorePolly.Service; using Autofac; using System.Reflection; using Autofac.Extensions.DependencyInjection; using Autofac.Extras.DynamicProxy; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers();// 以下是autofac依赖注入 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); builder.Host.ConfigureContainer<ContainerBuilder>(builder => { //先注入JWT //builder.RegisterType<AuthorizeJWT>().As<IAuthorizeJWT>();//可以是其他接口和类 // 注入Service程序集 //Assembly assembly = Assembly.Load(ServiceAutofac.GetAssemblyName());//可以是其他程序集 //builder.RegisterAssemblyTypes(assembly) //.AsImplementedInterfaces() //.InstancePerDependency(); builder.RegisterType<UserServiceBy>().As<IUserService>().SingleInstance().EnableInterfaceInterceptors(); builder.RegisterType<CustomPollyPolicyInterceptor>(); builder.RegisterType<TestPolicyInterceptor>(); }); var app = builder.Build(); // Configure the HTTP request pipeline. app.UseAuthorization(); app.MapControllers(); app.Run();
程序启动后先进入controllers 然后进入自定义拦截器再进入特性的构造函数获取值
打印结果如下
下面是.netCore基于 ActionFilterAttribute 过滤器实现所有入参自动打印,响应值自动记录
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; namespace CorePolly.Filter { public class HelloFilter : ActionFilterAttribute { /// <summary> /// 方法执行之前执行 /// </summary> /// <param name="context"></param> public override void OnActionExecuting(ActionExecutingContext context) { Console.WriteLine("方法执行之前执行"); var descriptor = context.ActionDescriptor as ControllerActionDescriptor; string param = string.Empty; string globalParam = string.Empty; foreach (var arg in context.ActionArguments) { string value = Newtonsoft.Json.JsonConvert.SerializeObject(arg.Value); param += $"{arg.Key} : {value} \r\n"; globalParam += value; } Console.WriteLine($"webapi方法名称:【{descriptor.ActionName}】接收到参数为:{param} 方法请求的方式{context.HttpContext.Request.Method}"); //base.OnActionExecuting(context); } /// <summary> /// 方法调用之后执行 /// </summary> /// <param name="context"></param> public override void OnActionExecuted(ActionExecutedContext context) { Console.WriteLine("方法调用之后执行"); //base.OnActionExecuted(context); } /// <summary> /// result方法调用前执行 /// </summary> /// <param name="context"></param> public override void OnResultExecuting(ResultExecutingContext context) { Console.WriteLine("result方法调用前执行"); //base.OnResultExecuting(context); } /// <summary> /// result 方法调用后执行 /// </summary> /// <param name="context"></param> public override void OnResultExecuted(ResultExecutedContext context) { Console.WriteLine("result 方法调用后执行"); var descriptor = context.ActionDescriptor as ControllerActionDescriptor; string result = string.Empty; if (context.Result is ObjectResult) { result = Newtonsoft.Json.JsonConvert.SerializeObject(((ObjectResult)context.Result).Value); } Console.WriteLine($"webapi方法名称【{descriptor.ActionName}】执行的返回值 : {result}"); //base.OnResultExecuted(context); } } }
然后在控制器上进行标记即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?