.net Core 中自定义筛选器
异常筛选器:
定义:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; public class MyExceptionFilter : IAsyncExceptionFilter { private readonly ILogger<MyExceptionFilter> logger; private readonly IHostEnvironment env; public MyExceptionFilter(ILogger<MyExceptionFilter> logger, IHostEnvironment env) { this.logger = logger; this.env = env; } public Task OnExceptionAsync(ExceptionContext context) { Exception exception = context.Exception; logger.LogError(exception, "UnhandledException occured"); string message; if (env.IsDevelopment()) { message = exception.ToString(); } else { message = "程序中出现未处理异常"; } ObjectResult result = new ObjectResult(new { code = 500, message = message }); result.StatusCode = 500; context.Result = result; context.ExceptionHandled = true; return Task.CompletedTask; } }
在program。cs 注册这个筛选器:
builder.Services.Configure<MvcOptions>(options => { options.Filters.Add<MyExceptionFilter>(); });
普通操作筛选器:
定义:
using Microsoft.AspNetCore.Mvc.Filters; public class MyActionFilter1 : IAsyncActionFilter { public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { Console.WriteLine("MyActionFilter 1:开始执行"); ActionExecutedContext r = await next(); if (r.Exception != null) { Console.WriteLine("MyActionFilter 1:执行失败"); } else { Console.WriteLine("MyActionFilter 1:执行成功"); } } }
自动开启事务,自动提交事务的筛选器
using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; using System.Reflection; using System.Transactions; namespace 自动启用事务的筛选器 { public class TransactionScopeFilter : IAsyncActionFilter { public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { bool hasNotTransactionalAttribute = false; if (context.ActionDescriptor is ControllerActionDescriptor) { var actionDesc = (ControllerActionDescriptor)context.ActionDescriptor; hasNotTransactionalAttribute = actionDesc.MethodInfo .IsDefined(typeof(NotTransactionalAttribute)); } if (hasNotTransactionalAttribute) { await next(); return; } using var txScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled); var result = await next(); if (result.Exception == null) { txScope.Complete(); } } } }
[AttributeUsage(AttributeTargets.Method)] public class NotTransactionalAttribute : Attribute { }
以上示例代码来自杨中科老师:
NETBookMaterials/第七章 at main · yangzhongke/NETBookMaterials · GitHub
分类:
.Net Core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具