Asp.Net Core 设置默认 API 版本控制

Sae*_*aei 2 .net versioning asp.net api asp.net-core

我使用 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();
Run Code Online (Sandbox Code Playgroud)

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

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

版本 2:

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

我可以将结果作为流动网址:

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

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

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

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

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

Ale*_*der 8

如果没有指定,您的配置会正确设置默认 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}";
    }
}
Run Code Online (Sandbox Code Playgroud)

现在 request tohttp://localhost:5000/users/log将指向带有 api version 的控制器1.0。如果将此路由添加到第二个控制器,1.0则仍将选择版本,因为ApiVersion将选择默认值并且它是1.0.

  • 这是正确的答案。@SaeidMirzaei,根本不可能按照你的要求去做。如果没有“{id}”参数,您不会期望“/api/values/{id}/subvalues”能够工作。当您按 URL 段进行版本控制时,情况也是如此。`AssumedDefaultVersionWhenUnspecified` 并不是为了解决这个问题,而是另一个例子,说明了为什么通过 URL 段进行版本控制是最不 RESTful 的方法。需要双路由注册。要过滤 OpenAPI/Swagger 文档生成,您可以使用自定义 **IApiDescriptionProvider** 或 **IOperationFilter**(对于 Swashbuckle)。 (2认同)