0

我按照使用 ASP.NET Core 的 REST API 版本控制说明在响应标头中显示我的 API 版本。

这是我的配置代码

 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;不起作用。

4

2 回答 2

1

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

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

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

我希望这会有所帮助

于 2020-04-28T22:11:26.707 回答
0

我找到了解决方案。我必须添加[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);
    }
}
于 2020-03-31T12:00:17.393 回答