.NET Core 3.1自定义中间件无法获取RouteData值的问题
问题原因及解决方法
问题根源是中间件顺序错误,导致自定义预授权中间件执行时,路由匹配尚未完成,HttpContext中的RouteData未被正确填充。
解决步骤
修正中间件顺序到正确位置
.NET Core 3.1对中间件顺序有严格要求,必须确保路由匹配逻辑先执行,再处理认证、授权等操作。调整后的正确顺序如下:app.UseHttpsRedirection(); // 必须放在最前面,优先处理HTTP到HTTPS的重定向 app.UseRouting(); // 先执行路由匹配,填充RouteData和Endpoint app.UseCors("CorsPolicy"); app.UseAuthentication(); app.UsePreAuthorizationMiddleware(); // 移到此处,确保路由已完成匹配 app.UseAuthorization(); app.UseSession(); // Session需放在授权之后 app.UseEndpoints(endpoints => { endpoints.MapControllers(); // 必须配置此句才能处理属性路由 });确保中间件正确调用后续管道
自定义中间件的InvokeAsync方法必须调用后续中间件,否则请求管道会中断,路由匹配无法完成:public async Task InvokeAsync(HttpContext httpContext) { // 此时可正确获取RouteData var routeData = httpContext.GetRouteData(); var recordId = routeData.Values["id"]; // 能拿到属性路由中的Guid参数 // 必须调用后续中间件,保证请求正常流转 await _next(httpContext); }
为什么之前拿不到RouteData?
- 原顺序中
UseHttpsRedirection放在UseRouting之后,若请求为HTTP协议会触发重定向,当前请求的RouteData未被完整处理;即使是HTTPS请求,中间件顺序错位也导致路由匹配结果未及时同步到HttpContext。 - 授权处理器能拿到
RouteData,是因为它依赖端点(Endpoint)的元数据,而端点的完整填充是在靠近UseEndpoints的阶段,授权中间件内部会确保路由匹配已完成。
内容的提问来源于stack exchange,提问作者Rajeev Menon
相关产品推荐
相关产品推荐

