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

如何实现ASP.NET Core API版本含主次版但路径仅保留主版?

解决方案

错误原因

你遇到的UnsupportedApiVersion错误,根源是API版本控制系统默认会尝试匹配完整的版本号(如1.1),但你的路由硬编码了v1(仅主版本),系统会将其解析为版本1.0,与控制器标记的1.1不匹配,因此拒绝请求。

推荐配置方式

采用路由占位符+版本选择器的方案,既满足路由仅显示主版本的需求,又能让系统正确匹配控制器的完整版本。

1. 配置Program.cs中的API版本服务

修改AddApiVersioning的配置,添加版本读取规则、默认版本和自动版本选择逻辑:

builder.Services.AddApiVersioning(options =>
{
    options.ReportApiVersions = true;
    options.AssumeDefaultVersionWhenUnspecified = true;
    // 设置默认版本为控制器标记的1.1
    options.DefaultApiVersion = new ApiVersion(1, 1);
    // 从URL段读取版本(对应路由中的{version}占位符)
    options.ApiVersionReader = new UrlSegmentApiVersionReader();
    // 自动选择主版本下的最新次版本(如请求v1时匹配1.1)
    options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options);
    // 允许版本非精确匹配(兼容主版本请求)
    options.MatchExactly = false;
});

2. 修改控制器的路由模板

将硬编码的v1替换为版本占位符{version:apiVersion},让API版本系统自动关联路由与控制器版本:

[ApiController]
[ApiVersion("1.1")]
// 使用版本占位符,路由会自动解析为/v1/WeatherForecast
[Route("v{version:apiVersion}/[controller]")]
public class WeatherForecastController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok(new { Version = "1.1", Message = "Weather forecast data" });
    }
}

硬编码路由的备选方案(不推荐)

如果必须保持路由硬编码为v1,可以通过以下配置让系统强制使用指定版本:

控制器修改

[ApiController]
[ApiVersion("1.1")]
[MapToApiVersion("1.1")]
[Route("v1/[controller]")]
public class WeatherForecastController : ControllerBase
{
    // ...
}

Program.cs配置

builder.Services.AddApiVersioning(options =>
{
    options.ReportApiVersions = true;
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.DefaultApiVersion = new ApiVersion(1, 1);
    // 禁用从URL读取版本,依赖默认版本匹配
    options.ApiVersionReader = new NullApiVersionReader();
});

这种方式的弊端是扩展性差,后续新增版本时需要重复硬编码路由。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:35:38