我无法使用 Api Versioning .net Core 显示 API 版本以响应 header

I cant show the API versions in response header with ApiVersioning .net Core

我按照说明 REST API versioning with ASP.NET Core 在响应中显示我的 API 版本 header。

这是我的配置代码:

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddMvc().AddNewtonsoftJson();
        services.AddMvc(opt =>
        {

        services.AddRouting(env => env.LowercaseUrls = true);
        services.AddApiVersioning(opt => {
            opt.ApiVersionReader = new MediaTypeApiVersionReader();
            opt.AssumeDefaultVersionWhenUnspecified = true;
            opt.ReportApiVersions = true;
            opt.DefaultApiVersion = new ApiVersion(1, 0);
            opt.ApiVersionSelector = new CurrentImplementationApiVersionSelector(opt);
        });
    }

这是我的 控制器 :

[Route("/")]
[ApiVersion("1.0")]
public class RootController:Controller
{
    [HttpGet(Name =nameof(GetRoot))]
    public IActionResult GetRoot()
    {
        var response = new { href = Url.Link(nameof(GetRoot),null) };
        return Ok(response);
    }
}

当我用邮递员测试我的 API 时,我得到了这个结果:

我不知道为什么 opt.ReportApiVersions = true; 不起作用。

我找到了解决方案。我必须将 [ApiController] 添加到我的控制器:

[Route("/")]
[ApiVersion("1.0")]
[ApiController]
public class RootController:Controller
{
    [HttpGet(Name =nameof(GetRoot))]
    public IActionResult GetRoot()
    {
        var response = new { href = Url.Link(nameof(GetRoot),null) };
        return Ok(response);
    }
}

为什么 这样做的原因是为了消除 API 控制器与 UI 控制器的歧义。在 ASP.NET Core 中,实际上并没有任何其他内置方法可以这样做,因为 - 控制器就是控制器

还有一些其他方法可以改变这种行为:

  • 选择退出 options.UseApiBehavior = false[ApiController]
  • 之前的情况一样
  • 添加自定义 IApiControllerSpecification 来标识 API 控制器(有一个内置实现可以理解 [ApiController]
  • 替换默认的 IApiControllerFilter 服务,它实际上只是所有已注册 IApiControllerSpecification 实现的集合

希望对你有所帮助