<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
ASP.NET API versioning為您提供了一種功能強大但易於使用的方法,用於將API版本控制語意新增到使用ASP.NET構建的新的和現有的REST服務中。API版本控制擴充套件定義了簡單的後設資料屬性和約定,用於描述您的服務實現了哪些API版本。
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.2.0" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="4.2.0" />
[ApiVersion("1.1")] //設定版本號 [ApiVersionNeutral]//退出版本控制 [MapToApiVersion("1.1")] //設定獨立版本 [ApiVersion("1.0", Deprecated = true)]//api版本已經被棄用 HttpContext.GetRequestedApiVersion().ToString(); //存取版本資訊
//Versioning用來實現API的版本控制 services.AddApiVersioning(options => { options.DefaultApiVersion = new ApiVersion(1, 1);//預設版本號 options.AssumeDefaultVersionWhenUnspecified = true;//此選項將用於不提供版本的請求,預設情況下假定API的版本為1.0 options.ReportApiVersions = true;//當設定為true時候,api將返回響應檔頭中支援的版本資訊 //下面這句預設不寫也可以 //options.ApiVersionReader = new QueryStringApiVersionReader(parameterNames: "api-version");//該名稱用於查詢時候使用 });
namespace NetCore_SwaggerVersion.Controllers.v1 { /// <summary> /// 版本1.1 /// </summary> [Route("api/[controller]")] [ApiController] [ApiVersion("1.1")]//可以設定多個 [ApiVersion("1.2")] public class TestController : ControllerBase namespace NetCore_SwaggerVersion.Controllers.v2 { /// <summary> /// 版本2.0 /// </summary> [Route("api/[controller]")] [ApiController] [ApiVersion("2.6")] public class TestController : ControllerBase
不同名稱空間下可以存在相同的控制器
[MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> Get()
[ApiVersionNeutral]//退出版本控制 [ApiController] [Route("api/[controller]/[action]")] public class WeatherForecastController : ControllerBase
http://localhost:5000/api/WeatherForecast/Get //不寫版本號的話走的是預設的版本號 http://localhost:5000/api/Test?api-version=1.1 http://localhost:5000/api/Test?api-version=1.2 http://localhost:5000/api/Test?api-version=2.6
//Versioning用來實現API的版本控制 services.AddApiVersioning(options => { options.DefaultApiVersion = new ApiVersion(1, 1);//預設版本號 options.AssumeDefaultVersionWhenUnspecified = true;//此選項將用於不提供版本的請求,預設情況下假定API的版本為1.0 options.ReportApiVersions = true;//當設定為true時候,api將返回響應檔頭中支援的版本資訊 });
namespace NetCore_SwaggerVersion.Controllers.v1 { /// <summary> /// 版本1.1 /// </summary> [Route("api/v{version:apiVersion}/[controller]")] [ApiController] [ApiVersion("1.0")] [ApiVersion("1.1")]//定義控制器提供哪個版本的API public class TestController : ControllerBase namespace NetCore_SwaggerVersion.Controllers.v2 { /// <summary> /// 版本2.0 /// </summary> [Route("api/v{version:apiVersion}/[controller]")] [ApiController] [ApiVersion("2.6")] public class TestController : ControllerBase
不同名稱空間下可以存在相同的控制器
[MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> Get()
[ApiVersionNeutral]//退出版本控制 [ApiController] [Route("api/[controller]/[action]")] public class WeatherForecastController : ControllerBase
http://localhost:5000/api/v1.0/Test http://localhost:5000/api/v1.1/Test http://localhost:5000/api/v2.6/Test http://localhost:5000/api/WeatherForecast/Get 不受版本控制
//Versioning用來實現API的版本控制 services.AddApiVersioning(options => { options.DefaultApiVersion = new ApiVersion(1, 1);//預設版本號 options.AssumeDefaultVersionWhenUnspecified = true;//此選項將用於不提供版本的請求,預設情況下假定API的版本為1.0 options.ReportApiVersions = true;//當設定為true時候,api將返回響應檔頭中支援的版本資訊 //header傳遞版本資訊 options.ApiVersionReader = new HeaderApiVersionReader("version"); options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options);//如果沒有傳輸版本號,那麼會使用最大版本號 LowestImplementedApiVersionSelector是最小版本號 options.UseApiBehavior = false;//是否使用API行為 });
namespace NetCore_SwaggerVersion.Controllers.v1 { /// <summary> /// 版本1.1 /// </summary> [Route("api/[controller]")] [ApiController] [ApiVersion("1.1")]//定義控制器提供哪個版本的API public class TestController : ControllerBase namespace NetCore_SwaggerVersion.Controllers.v2 { /// <summary> /// 版本2.0 /// </summary> [Route("api/[controller]")] [ApiController] [ApiVersion("2.6")] public class TestController : ControllerBase
不同名稱空間下可以存在相同的控制器
[MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> Get()
[ApiVersionNeutral]//退出版本控制 [ApiController] [Route("api/[controller]/[action]")] public class WeatherForecastController : ControllerBase
http://localhost:5000/api/Test //需要在headers裡面增加 version: 1.1 http://localhost:5000/api/WeatherForecast/Get 不受版本控制
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" }} });
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 }; } } }
偵錯程式碼發現這種方式只在程式第一次執行的時候會執行,之後不會再執行多次,因此效率很高。
到此這篇關於.NET實現API版本控制的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45