netcore-api版本控制返回404

问题描述

我正在使用软件包Microsoft.AspNetCore.Mvc.Versioning在NetCore 3项目中实现Api版本控制,但是如果我尝试将版本添加到路由器中,则会抛出一个错误-如果不通过路由,它会很好地工作。

这是我所做的:

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;


namespace Aus.GGG.Company
{
    [Route("v{version:apiVersion}/[controller]")]
    [ApiController]
    [ApiVersion("1.0")]
    public class BaseController : ControllerBase
    {

        [HttpGet("/test.json")]
        public async Task<IActionResult> Get() => Ok("test");
    }
}

这就是我添加服务的方式:

        public static IServiceCollection RegisterExtraStuff(this IServiceCollection services)
        {
            services.AddApiVersioning(config =>
            {
                config.DefaultApiVersion = new ApiVersion(1,0);
                config.AssumeDefaultVersionWhenUnspecified = true;
                config.ReportApiVersions = true;
            });

            return services;
        }

    }

这是不起作用的卷曲:

curl --location --request GET 'http://localhost:3000/v1.0/test.json

起作用的卷曲:

curl --location --request GET 'http://localhost:3000/test.json

在最后一次卷曲中,我可以在响应中看到额外的标题api-supported-versions,所以我的配置看起来不错。

关于缺少什么的任何想法吗?

解决方法

您在动作路线的开头添加了一个斜杠,它将忽略控制器上的route属性。

如果您想要这样的格式:

http://localhost:3000/v1.0/test.json

您可以按如下所示进行更改:

[Route("v{version:apiVersion}")]
[ApiController]
[ApiVersion("1.0")]
public class BaseController : ControllerBase
{

    [HttpGet("test.json")]
    public async Task<IActionResult> Get() => Ok("test");
}
,
[ApiController]
[ApiVersion("1")]
[Route("api/v{version:apiVersion}/shared/[action]")]
public class DemoController : ControllerBase
{
   public IActionResult TestMethod()
   {
       return ...
   }
}