问题描述
我正在使用软件包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 ...
}
}