Asp.net core 是否有办法要求URL路径段中存在次要版本?

Asp.net core 是否有办法要求URL路径段中存在次要版本?,asp.net-core,aspnet-api-versioning,Asp.net Core,Aspnet Api Versioning,我正在使用aspnet api版本控制库创建一个相当简单的版本控制策略,使用名称空间/文件夹来指定路由。我的启动代码如下所示: services.AddApiVersioning(options => { options.AssumeDefaultVersionWhenUnspecified = true; options.ReportApiVersions = true; options.Conventions.Add(new VersionByNamespace

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

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);
        }
    }
}
我的控制器通常如下所示:

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/消息/特定路线
    (匹配1.0)
  • /v1.0/消息/特定路线
理想情况下,我希望消除第二个版本,并要求所有指定版本的调用都指定主版本和次版本。换句话说,我希望对调用“v1”的响应与对任何未定义版本的响应相同。这个库提供了实现这一点的技术吗


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

答案是-是。。。没有

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

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

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

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


答案是——是的。。。没有

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

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

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

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