我无法使用 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 实现的集合
希望对你有所帮助
我按照说明 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 实现的集合
希望对你有所帮助