1

我正在使用该aspnet-api-versioning库创建一个相当简单的版本控制策略,使用名称空间/文件夹来指定路由。我的启动代码如下所示:

services.AddApiVersioning(options =>
{
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.ReportApiVersions = true;
    options.Conventions.Add(new VersionByNamespaceConvention());
});

我的控制器通常如下所示:

namespace Something.Api.V1_0.Controllers
{
    [ApiController]
    [Route("[controller]")]
    [Route("v{version:apiVersion}/[controller]")]
    public class MessageController : ControllerBase
    {
        [HttpGet]
        public IActionResult Get()
        {
            var formattedVersion = GetApiVersionString(HttpContext.GetRequestedApiVersion());
            var message = $"V1: It is Get in v1 controller (version {formattedVersion}).";

            return Ok(message);
        }

        [HttpGet]
        [Route("specific-route")]
        public IActionResult SpecificRoute()
        {
            var formattedVersion = GetApiVersionString(HttpContext.GetRequestedApiVersion());
            var message = $"V1: It is specific route (version {formattedVersion}).";

            return Ok(message);
        }
    }
}

不要关注GetApiVersionString(),它只是格式化版本字符串的私有方法。

此设置允许我将以下路由发送到此控制器的“特定路由”方法:

  • /Message/specific-route(这是为不知道版本控制的客户准备的)
  • /v1/Message/specific-route(匹配 1.0)
  • /v1.0/Message/specific-route

理想情况下,我想消除其中的第二个,并要求所有指定版本的调用都指定主要版本次要版本。换句话说,我希望对“v1”调用的响应与对任何未定义版本的调用相同。这个库是否提供任何技术来实现这一点?

注意:我所有的命名空间/文件夹都将遵循该V_x格式,因此我的方案中总会有一个次要版本。

4

1 回答 1

0

答案是——是的……而且不是。

是的,可以强制格式化的 API 版本字符串值包含次要版本。使用version.ToString("VV")将格式化版本中的major.minor格式。如果未指定次要版本,则假定为0. 这也适用于比较,这意味着1 == 1.0.

不,从某种意义上说,客户端可能不会指定次要数字版本。虽然它在 100% 显式方面可能很有用,但在通过 URL 对客户端请求进行版本控制时,将其设为可选会更实用。您可以完全自由地强加您的意愿并生成明确包含其中的 URL .0。最终的净效果是相同的。

null您还可以添加某种类型的中间件或其他东西,如果有一个 API 版本可以生成次要版本,则可以短路。

顺便说一句:您仍然可以使用HttpContext.GetRequestedApiVersion(),但模型绑定现在让这变得更容易了。您可以通过添加 API 版本参数来实现相同的目的。例如,public IActionResult Get(ApiVersion version)

于 2020-09-16T21:59:12.870 回答