Asp.Net核心集默认API版本控制

时间:2019-03-29 11:42:32

标签: asp.net .net api asp.net-core versioning

我将Asp.Net Core用作Rest API服务。我需要API版本控制。实际上,我在“启动”中进行了以下设置,并且可以正常使用,但是当我设置为默认版本时,则无法使用。

services.AddVersionedApiExplorer(
                options =>
                    {
                        options.GroupNameFormat = "'v'VVV";
                        options.SubstituteApiVersionInUrl = true;
                        options.AssumeDefaultVersionWhenUnspecified = true;
                        options.DefaultApiVersion = new ApiVersion(1, 0);
                    });
services.AddApiVersioning(
                options =>
                    {
                        options.ReportApiVersions = true;
                        options.AssumeDefaultVersionWhenUnspecified = true;
                        options.DefaultApiVersion = new ApiVersion(1, 0);
                    })
            .AddMvc(
                options =>
                    {
                        options.RespectBrowserAcceptHeader = true;
                    })
            .AddXmlSerializerFormatters();

并在控制器中设置属性,如下所示: 版本1:

[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class UsersController : ControllerBase
{
    [HttpGet("log")]
    public string Get()
    {
        return $"{DateTime.Now}";
    }
}

版本2:

[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[ApiVersion("2.0")]
public class UsersController : ControllerBase
{
    [HttpGet("log")]
    public string Get()
    {
        return $"{DateTime.Now}";
    }
}

我可以得到如下结果:

http://localhost:5000/v1/users/log =>状态码:200

http://localhost:5000/v2/users/log =>状态码:200

但是http://localhost:5000/users/log =>状态码:404

如何在Versioning中设置默认API?

感谢大家花时间尝试并帮助解释

1 个答案:

答案 0 :(得分:0)

如果未指定默认api版本,则您的配置正确设置了默认api版本。但是您的路线要求请求网址包含v{version}部分。因此,一种可能的解决方案是添加不带v{version}的另一条路线

[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[Route("/[controller]")]
[ApiVersion("1.0")]
public class UsersController : ControllerBase
{
    [HttpGet("log")]
    public string Get()
    {
        return $"{DateTime.Now}";
    }
}

现在对http://localhost:5000/users/log的请求将指向api版本为1.0的控制器。如果将此路由添加到第二个控制器,则仍将选择版本1.0,因为将选择默认ApiVersion,并且它的名称为1.0