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

ASP.NET Core Web API版本控制:未声明版本被匹配问题求助

问题

在微服务中使用Asp.Versioning库对ASP.NET Core Web API控制器做版本控制,控制器代码如下:

using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;

[ApiController]
[ApiVersion("1")]
[ControllerName("example")]
[Route("v{version:apiVersion}/[controller]")]
public class ExampleController : ControllerBase
{
    [HttpGet("version")]
    [Produces("text/plain")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public IActionResult GetVersion() => Ok("v1");
}

服务配置代码:

services.AddApiVersioning(opt =>
{
    opt.ApiVersionReader = new UrlSegmentApiVersionReader();
}).AddApiExplorer(opt =>
{
    opt.GroupNameFormat = "'v'V";
});

执行curl请求时,无论使用已声明的v1还是未声明的v1337,都能匹配路由并返回结果。但控制器仅声明了ApiVersion("1"),期望未声明的版本返回404,请问是否配置有误?能否拒绝未声明版本?

解决方案

问题出在Asp.Versioning的默认配置上:默认情况下AssumeDefaultVersionWhenUnspecified为true,且默认版本是1.0。当请求的版本未被任何控制器支持时,框架会自动回退到默认版本,而你的控制器声明的ApiVersion("1")与默认版本1.0等价,所以未声明的版本(如v1337)会被匹配到v1的控制器。

要实现拒绝未声明版本的需求,只需修改服务配置,关闭默认版本回退行为:

services.AddApiVersioning(opt =>
{
    opt.ApiVersionReader = new UrlSegmentApiVersionReader();
    // 关闭未指定版本时自动使用默认版本的逻辑
    opt.AssumeDefaultVersionWhenUnspecified = false;
    // 可选:开启响应头返回当前API支持的所有版本
    opt.ReportApiVersions = true;
}).AddApiExplorer(opt =>
{
    opt.GroupNameFormat = "'v'V";
    // 可选:确保API文档生成时替换URL中的版本占位符
    opt.SubstituteApiVersionInUrl = true;
});

修改后,当请求未被控制器声明的版本(如v1337)时,框架会找不到对应的匹配控制器,返回404状态码,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:33:31