【问题标题】:Asp.Net Core Set Default API VersioningAsp.Net Core 设置默认 API 版本控制
【发布时间】:2019-08-20 08:27:04
【问题描述】:

我正在使用 Asp.Net Core 作为 Rest API 服务。我需要有 API 版本控制。实际上,我在 Startup 以下设置中进行了设置,它可以正常工作,但是当我设置为默认版本时,它无法正常工作。

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

如何在版本控制中设置默认 API?

感谢大家抽出宝贵时间尝试帮助解释

【问题讨论】:

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


    【解决方案1】:

    如果未指定,您的配置会正确设置默认 api 版本。但是您的路线要求请求 url 包含 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。

    【讨论】:

    • 感谢您的指导,如果我向控制器添加新路由,我会在 Swagger 文档中获得新路由。
    • @SaeidMirzaei 我的帖子回答了您发布的问题。请更新它或创建一个单独的新问题。关于swagger中的新路由我不知道如何防止这种情况,恐怕您需要选择另一个路由模板进行版本控制,但我不确定。
    • 这是正确答案。 @SaeidMirzaei,根本不可能按照您的要求去做。如果没有 {id} 参数,您不会期望 /api/values/{id}/subvalues 能够工作。当您按 URL 段进行版本控制时也是如此。 AssumedDefaultVersionWhenUnspecified 并不是为了解决这个问题,它是另一个例子,说明为什么按 URL 段进行版本控制是最少的 RESTful 方法。需要双路注册。要过滤 OpenAPI/Swagger 文档生成,您可以使用自定义 IApiDescriptionProvider 或 IOperationFilter(用于 Swashbuckle)。
    猜你喜欢
    • 2022-08-02
    • 1970-01-01
    • 2021-06-19
    • 2019-05-28
    • 2018-05-23
    • 2019-01-13
    • 2016-08-23
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多