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
推荐阅读
- 线程安全问题无大小:Java中的线程安全之操作共享数据分类
- 曹操在官渡之战和赤壁之战一胜一负的原因,官渡之战曹操胜,赤壁之战曹操败,启示
- 潘粤明|潘粤明新剧《新居之约》定档,又被催减肥,越减越胖自有他的底气
- 王莽是刘秀所灭还是刘玄,刘玄之后谁做了皇帝
- 俯卧撑什么时候做比较好呢
- 朱高炽的皇后叫什么名字,朱高炽之后是谁当的皇帝
- 隋唐之猛将秦琼,在名著隋唐演义中秦琼的表弟
- 落凤坡是在庞统死后改的名的吗,庞统落凤坡之谜
- 夫妻之间冷战怎么修复?
- 岁寒然后知松柏之凋也出自哪首诗?
