.NET Core 3.1升级到6后,UseStatusCodePagesWithReExecute下IActionInvokerProvider行为异常
问题原因分析
这个问题的核心是.NET 6对**端点路由(Endpoint Routing)**的优化导致的,具体变化如下:
- .NET Core 3.1中,
UseStatusCodePagesWithReExecute发起的重执行请求会完整遍历MVC管道,包括通过IActionInvokerProvider创建IActionInvoker的环节,因此你的Provider会被调用两次。 - .NET 6里,框架对重执行请求的端点匹配做了优化:当重执行的目标是一个已被识别的端点(比如你的
/somecontroller对应的控制器动作),会直接复用之前解析好的端点元数据,跳过了IActionInvokerProvider的初始化调用流程,所以第二次请求不会触发你的Provider。
直接访问/somecontroller?statusCode=404时是全新请求,框架需要从头解析端点并初始化MVC执行链,因此IActionInvokerProvider会被正常调用。
可行的解决方向
- 改用中间件注入逻辑:如果你的需求是向路由上下文添加信息,可以编写一个自定义中间件,放在
UseStatusCodePagesWithReExecute之前,这样重执行的请求也会经过这个中间件,达到类似效果。 - 手动触发Provider逻辑:在重执行的目标控制器动作中,手动调用你的
IActionInvokerProvider里的逻辑,或者将逻辑提取到可复用的服务中,在需要的地方调用。 - 调整端点匹配方式:可以尝试让重执行的目标不直接匹配已有的控制器端点,比如用一个简单的中间件处理状态码页面,避免框架复用端点元数据。
内容的提问来源于stack exchange,提问作者Glenit
相关产品推荐
相关产品推荐

