You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6替换app.UseMvc()为UseRouting后遇多端点匹配错误求助

解决.NET6中API版本路由端点冲突问题

出现这个错误的核心原因是:替换为端点路由(UseRouting+UseEndpoints)后,API版本的路由匹配逻辑和原UseMvc模式存在差异,导致同一个请求路径同时匹配到了V1和V2的控制器端点。

按照以下步骤修复:

1. 显式注册API版本服务

在Program.cs中配置API版本相关服务,这是端点路由模式下的必要步骤(原UseMvc会隐式处理部分逻辑):

builder.Services.AddApiVersioning(options =>
{
    // 设置默认API版本,处理不带版本号的请求
    options.DefaultApiVersion = new ApiVersion(1, 0);
    // 请求不带版本时自动使用默认版本
    options.AssumeDefaultVersionWhenUnspecified = true;
    // 响应头中返回API版本信息(可选)
    options.ReportApiVersions = true;
});

2. 确保控制器路由的唯一性

从现有代码看,V1控制器同时配置了无版本路由和版本化路由,V2仅配置版本化路由,这个结构是合理的,但需要确保:

  • V1的[Route("api/[controller]")]仅匹配无版本请求,不会和V2的路由产生重叠;
  • 两个版本的控制器属于不同命名空间(错误信息显示已满足:Api.V1.Controllers和Api.V2.Controllers)。

如果仍存在冲突,可以给V1的无版本路由添加版本约束,明确限定仅匹配V1:

[Obsolete]
[ApiVersion("1.0", Deprecated = true)]
[Route("api/[controller]", Name = "V1_User")]
[Route("api/v{version:apiVersion}/[controller]")]
public class UserController : Controller
{
    // ...
}

3. 验证端点路由的版本约束生效

端点路由模式下,apiVersion路由约束依赖API版本服务解析请求中的版本信息(URL路径、查询参数或请求头),确保服务注册后,版本约束能精准匹配对应控制器:

  • 无版本请求GET /api/UserToDestinationMap → 匹配V1控制器
  • 带版本请求GET /api/v1/UserToDestinationMap → 匹配V1控制器
  • 带版本请求GET /api/v2/UserToDestinationMap → 匹配V2控制器

通过以上配置,即可恢复原UseMvc模式下的正常路由匹配逻辑,解决端点冲突问题。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:40:41