NetCore3 上的 WebApi 版本控制

Jai*_*rgo 3 c# asp.net-core-3.0 .net-core-3.0

我正在 NetCore3 中迈出第一步。我在 VS.NET 2019 中启动了一个默认的 webapi 项目,这创建了一个名为 WeatherForecastController 的控制器。我已经测试了 webapi,它返回一个带有虚拟信息的 JSON,到目前为止一切顺利。

现在,我试图通过以这种方式使用属性 Route 来使用版本控制:

[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
public class WeatherForecastController : ControllerBase
Run Code Online (Sandbox Code Playgroud)

但是我遇到了这个错误:

InvalidOperationException: 无法将约束引用“apiVersion”解析为类型。使用“Microsoft.AspNetCore.Routing.RouteOptions.ConstraintMap”注册约束类型

根据以下网址:

https://www.koskila.net/how-to-resolve-build-failing-with-net-core-3-and-microsoft-aspnetcore-mvc-versioning/

我已经安装了 Microsoft.AspNet.WebApi.Versioning 库的测试版,但我一直收到同样的错误。也许我遗漏了一些东西,或者我有一个愚蠢的错误,但我无法识别或解决它。

Xue*_*hen 11

Microsoft.AspNet.WebApi.Versioning依赖于 .NETFramework 4.5,而不是 .Net Core 。您需要Microsoft.AspNetCore.Mvc.Versioning -Version 4.0.0-preview8.19405.7在包管理器控制台中安装它提供对 ASP.NET Core 3.0 的支持,如下所示:

Install-Package Microsoft.AspNetCore.Mvc.Versioning -Version 4.0.0-preview8.19405.7
Run Code Online (Sandbox Code Playgroud)

然后services.AddApiVersioning();在Startup.cs中添加ConfigureServices

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddApiVersioning();
    }
Run Code Online (Sandbox Code Playgroud)

参考:https : //github.com/microsoft/aspnet-api-versioning/issues/499#issuecomment-521469545


小智 6

您是否在启动时配置了版本控制?

我正在使用这个包:Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer

这是我的 API 的代码

services.AddApiVersioning(options =>
{
   options.ReportApiVersions = true;
   options.AssumeDefaultVersionWhenUnspecified = true;
   options.DefaultApiVersion = new ApiVersion(1, 0);
});

services.AddVersionedApiExplorer(options =>
{
   options.GroupNameFormat = "'v'V";
   options.SubstituteApiVersionInUrl = true;
});
Run Code Online (Sandbox Code Playgroud)

...和控制器:

[ApiVersion("1.0")]
[Route("api/v{ver:apiVersion}/[controller]")]
public class MyController : ControllerBase
{
   ...
}
Run Code Online (Sandbox Code Playgroud)