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

Asp.Versioning.Http报AmbiguousMatchException:Header API版本控制端点冲突

解决Asp.Versioning.Http Header版本控制的AmbiguousMatchException异常

问题原因

  1. 两个版本的ThingsController使用完全相同的路由模板[Route("[controller]")],路由系统无法直接区分端点
  2. 配置中注释掉了HeaderApiVersionReader的启用代码,导致API版本控制组件无法通过请求头识别版本,无法筛选出正确的端点,最终触发路由匹配冲突

修复步骤

1. 启用Header版本读取器

在AddApiVersioning配置中取消注释版本读取器的设置,让组件能识别请求头中的版本参数:

builder.Services.AddApiVersioning(options => {
    options.ApiVersionReader = new HeaderApiVersionReader("api-version");
    options.DefaultApiVersion = new ApiVersion(1.0);
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.ReportApiVersions = true;
}).EnableApiVersionBinding();

2. (可选,推荐)给路由添加版本约束

虽然启用Header读取后已能解决冲突,但给路由添加版本约束可以让路由规则更清晰,同时兼容URL路径版本传递的场景:

  • V1控制器修改路由:
namespace Things.Service.Controllers.V1
{
 [ApiController]
 [ApiConventionType(typeof(DefaultApiConventions))]
 [Route("v{version:apiVersion}/[controller]")]
 [Asp.Versioning.ApiVersion(1.0)]
 public class ThingsController : ControllerBase
 {
    // controller logic
 }
}
  • V2控制器修改路由:
namespace Things.Service.Controllers.V2
{
 [ApiController]
 [ApiConventionType(typeof(DefaultApiConventions))]
 [Route("v{version:apiVersion}/[controller]")]
 [Asp.Versioning.ApiVersion(2.0)]
 public class ThingsController : ControllerBase
  {
    // controller logic
  }
}

验证说明

  • 发送请求时添加请求头api-version: 1.0,请求会路由到V1版本控制器
  • 添加请求头api-version: 2.0,请求会路由到V2版本控制器
  • 未指定版本时,会默认使用V1.0版本(因配置了AssumeDefaultVersionWhenUnspecified=true)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:45:27