Asp.Net 核心集默认 API 版本控制
Asp.Net Core Set Default API Versioning
我正在使用 Asp.Net 核心作为休息 API 服务。我需要 API 版本控制。实际上,我在 Startup 中设置了以下设置并且它工作正常但是当我设置为默认版本时它不起作用。
services.AddVersionedApiExplorer(
options =>
{
options.GroupNameFormat = "'v'VVV";
options.SubstituteApiVersionInUrl = true;
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
});
services.AddApiVersioning(
options =>
{
options.ReportApiVersions = true;
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
})
.AddMvc(
options =>
{
options.RespectBrowserAcceptHeader = true;
})
.AddXmlSerializerFormatters();
并像这样在控制器中设置属性:
版本 1:
[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class UsersController : ControllerBase
{
[HttpGet("log")]
public string Get()
{
return $"{DateTime.Now}";
}
}
版本 2:
[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[ApiVersion("2.0")]
public class UsersController : ControllerBase
{
[HttpGet("log")]
public string Get()
{
return $"{DateTime.Now}";
}
}
我可以得到以下网址的结果:
http://localhost:5000/v1/users/log => 状态码:200
http://localhost:5000/v2/users/log => 状态码:200
但是http://localhost:5000/users/log => 状态码:404
如何在版本控制中设置默认 API?
谢谢大家抽空帮忙解释一下
如果指定 none,您的配置会正确设置默认 api 版本。但是您的路线需要请求 url 以包含 v{version}
部分。因此,一种可能的解决方案是添加另一条没有 v{version}
的路线,例如
[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[Route("/[controller]")]
[ApiVersion("1.0")]
public class UsersController : ControllerBase
{
[HttpGet("log")]
public string Get()
{
return $"{DateTime.Now}";
}
}
现在对 http://localhost:5000/users/log
的请求将指向具有 api 版本 1.0
的控制器。如果将此路由添加到第二个控制器,仍会选择版本 1.0
,因为将选择默认 ApiVersion
,它是 1.0
.
我正在使用 Asp.Net 核心作为休息 API 服务。我需要 API 版本控制。实际上,我在 Startup 中设置了以下设置并且它工作正常但是当我设置为默认版本时它不起作用。
services.AddVersionedApiExplorer(
options =>
{
options.GroupNameFormat = "'v'VVV";
options.SubstituteApiVersionInUrl = true;
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
});
services.AddApiVersioning(
options =>
{
options.ReportApiVersions = true;
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
})
.AddMvc(
options =>
{
options.RespectBrowserAcceptHeader = true;
})
.AddXmlSerializerFormatters();
并像这样在控制器中设置属性: 版本 1:
[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class UsersController : ControllerBase
{
[HttpGet("log")]
public string Get()
{
return $"{DateTime.Now}";
}
}
版本 2:
[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[ApiVersion("2.0")]
public class UsersController : ControllerBase
{
[HttpGet("log")]
public string Get()
{
return $"{DateTime.Now}";
}
}
我可以得到以下网址的结果:
http://localhost:5000/v1/users/log => 状态码:200
http://localhost:5000/v2/users/log => 状态码:200
但是http://localhost:5000/users/log => 状态码:404
如何在版本控制中设置默认 API?
谢谢大家抽空帮忙解释一下
如果指定 none,您的配置会正确设置默认 api 版本。但是您的路线需要请求 url 以包含 v{version}
部分。因此,一种可能的解决方案是添加另一条没有 v{version}
的路线,例如
[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[Route("/[controller]")]
[ApiVersion("1.0")]
public class UsersController : ControllerBase
{
[HttpGet("log")]
public string Get()
{
return $"{DateTime.Now}";
}
}
现在对 http://localhost:5000/users/log
的请求将指向具有 api 版本 1.0
的控制器。如果将此路由添加到第二个控制器,仍会选择版本 1.0
,因为将选择默认 ApiVersion
,它是 1.0
.