NET之API版本控制( 二 )

2.4.2 控制器设置版本namespace NetCore_SwaggerVersion.Controllers.v1{/// <summary>/// 版本1.1/// </summary>[Route("api/[controller]")][ApiController][ApiVersion("1.1")]//定义控制器提供哪个版本的APIpublic class TestController : ControllerBasenamespace NetCore_SwaggerVersion.Controllers.v2{/// <summary>/// 版本2.0/// </summary>[Route("api/[controller]")][ApiController][ApiVersion("2.6")]public class TestController : ControllerBase

不同命名空间下可以存在相同的控制器
2.4.3 特定方法设置版本[MapToApiVersion("1.1")][HttpGet]public IEnumerable<string> Get()2.4.4 设置不受版本控制[ApiVersionNeutral]//退出版本控制[ApiController][Route("api/[controller]/[action]")]public class WeatherForecastController : ControllerBase2.4.5 访问地址http://localhost:5000/api/Test//需要在headers里面增加 version: 1.1http://localhost:5000/api/WeatherForecast/Get 不受版本控制2.5 同时支持多种模式【NET之API版本控制】services.AddApiVersioning(o =>{o.ReportApiVersions = true;o.AssumeDefaultVersionWhenUnspecified = true;o.DefaultApiVersion = new ApiVersion(1, 0);o.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version"));//或者//同时支持查询字符串和标头o.ApiVersionReader = new QueryStringOrHeaderApiVersionReader(parameterName: "version"){HeaderNames = { "api-version", "x-ms-version" }}});2.6 不借助包,封装文件public class NameSpaceVersionRoutingConvention:IApplicationModelConvention{private readonly string apiPrefix;private const string urlTemplate = "{0}/{1}/{2}";public NameSpaceVersionRoutingConvention(string apiPrefix = "api"){this.apiPrefix = apiPrefix;}public void Apply(ApplicationModel application){foreach (var controller in application.Controllers){var hasRouteAttribute = controller.Selectors.Any(x => x.AttributeRouteModel != null);if (!hasRouteAttribute){continue;}var nameSpaces = controller.ControllerType.Namespace.Split('.');//获取namespace中版本号部分var version = nameSpaces.FirstOrDefault(x => Regex.IsMatch(x, @"^v(d+)$"));if (string.IsNullOrEmpty(version)){continue;}string template = string.Format(urlTemplate, apiPrefix, version,controller.ControllerName);controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel(){Template = template};}}}调试代码发现这种方式只在程序第一次运行的时候会执行,之后不会再执行多次,因此效率很高 。
借鉴于:
https://www.cnblogs.com/runningsmallguo/p/7484954.html
参考文档
https://github.com/microsoft/aspnet-api-versioning




推荐阅读