.NET Framework 4.8迁移至.NET 6:无法重写OnResultExecuting的问题
解决.NET 6中无法重写OnResultExecuting的问题
.NET 6(ASP.NET Core)的Controller类已移除了可重写的OnResultExecuting方法,原.NET Framework中的Controller生命周期方法已重构为过滤器接口体系。针对你的身份验证检查需求,以下是几种可行的解决方案:
方案一:自定义ResultFilterAttribute
继承ActionFilterAttribute(该类已实现相关过滤器接口),重写OnResultExecuting方法,即可实现原有逻辑,且能通过base.OnResultExecuting调用基类的默认处理:
public class AuthResultFilter : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext context) { // 检查用户是否认证 if (!context.HttpContext.User.Identity.IsAuthenticated) { // 调用基类默认逻辑 base.OnResultExecuting(context); return; } // 你的其他逻辑 // ... // 执行基类默认逻辑(如果需要) base.OnResultExecuting(context); } } // 应用到BaseController [AuthResultFilter] public abstract class BaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext context) { // 原有Action执行前逻辑 // ... base.OnActionExecuting(context); } }
方案二:在BaseController中添加内联过滤器
如果需要直接访问Controller的成员(比如User),可以在BaseController的构造函数中通过ResultFilters集合添加内联过滤器:
public abstract class BaseController : Controller { protected BaseController() { ResultFilters.Add(new MyResultFilter(this)); } protected override void OnActionExecuting(ActionExecutingContext context) { // 原有Action执行前逻辑 // ... base.OnActionExecuting(context); } private class MyResultFilter : IResultFilter { private readonly BaseController _controller; public MyResultFilter(BaseController controller) { _controller = controller; } public void OnResultExecuting(ResultExecutingContext context) { if (!_controller.User.Identity.IsAuthenticated) { // 后续过滤器会自动执行默认逻辑 return; } // 你的其他逻辑 // ... } public void OnResultExecuted(ResultExecutedContext context) { // 可选:处理结果执行后的逻辑 } } }
方案三:实现异步结果过滤器(推荐)
ASP.NET Core优先推荐异步过滤器,你可以实现IAsyncResultFilter来达到相同效果:
public class AsyncAuthResultFilter : IAsyncResultFilter { public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { if (!context.HttpContext.User.Identity.IsAuthenticated) { // 执行后续过滤器及结果逻辑(相当于原base调用) await next(); return; } // 你的其他逻辑 // ... // 执行后续过滤器及结果逻辑 await next(); } } // 全局注册过滤器(Program.cs中) builder.Services.AddControllersWithViews(options => { options.Filters.Add<AsyncAuthResultFilter>(); }); // 或单独应用到BaseController [TypeFilter(typeof(AsyncAuthResultFilter))] public abstract class BaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext context) { // 原有逻辑 base.OnActionExecuting(context); } }
关键说明
你之前直接实现IResultFilter无法调用base.OnResultExecuting,是因为ASP.NET Core的Controller基类并未实现该接口的方法,所以不存在对应的基类方法。上述方案通过继承ActionFilterAttribute(已封装默认逻辑)或利用过滤器集合的执行顺序,替代了原有的基类调用行为。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

