.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
标签:Core,logger,自定义,AspNetCore,result,context,using,net,public 来源: https://www.cnblogs.com/zhouxiuquan/p/16581491.html