


services.AddApiVersioning((o) => { o.ReportApiVersions = true;//可選配置,設置為true時,header返回版本信息 o.DefaultApiVersion = new ApiVersion(1, 0);//默認版本,請求未指明版本的求默認認執行版本1.0的API o.AssumeDefaultVersionWhenUnspecified = true;//是否啟用未指明版本API,指向默認版本 }).AddVersionedApiExplorer(option => { option.GroupNameFormat = "'v'VVVV";//api組名格式 option.AssumeDefaultVersionWhenUnspecified = true;//是否提供API版本服務 }).AddSwaggerGen((s) => { //填充UI內容 var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>(); foreach (var description in provider.ApiVersionDescriptions) { s.SwaggerDoc(description.GroupName, new Info() { Title = $"體檢微服務接口 v{description.ApiVersion}", Version = description.ApiVersion.ToString(), Description = "微服務框架-切換版本請點右上角版本切換", Contact = new Contact() { Name = "榮少(黎更榮) WeChat:186***** QQ:157537648", Email = "*******@hotmail.com" } } ); } //生成API XML文檔 var basePath = PlatformServices.Default.Application.ApplicationBasePath; var xmlPath = Path.Combine(basePath, typeof(Startup).GetTypeInfo().Assembly.GetName().Name + ".xml"); s.IncludeXmlComments(xmlPath); });
以上代碼其中option.GroupNameFormat = "'v'VVVV";//api組名格式,各位可以嘗試玩玩~~~~
在Startup->Configure方法中添加以下代碼
app.UseSwagger().UseSwaggerUI((o) => { foreach (var description in provider.ApiVersionDescriptions) { o.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant()); } });
其中在Startup->Configure方法中缺少了IApiVersionDescriptionProvider provider參數,自己手動補上即可
//項目自動生成的版本 public void Configure(IApplicationBuilder app, IHostingEnvironment env) //參數補上后的版本 public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApiVersionDescriptionProvider provider)
以上配置基本上算時完成了,那么Web Api要怎么寫法呢?
在WebApi項目中Controllers下建立v1、v2倆個文件夾
namespace WebApplication1.Controllers.v1 { [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/[controller]")] [ApiController] public class ValuesController : ControllerBase { [HttpGet] public ActionResult<IEnumerable<string>> Get() { return new string[] { "v1", "v1" }; } } }
namespace WebApplication1.Controllers.v2 { [ApiVersion("2.0")] [Route("api/v{version:apiVersion}/[controller]")] [ApiController] public class ValuesController : ControllerBase { [HttpGet] public ActionResult<IEnumerable<string>> Get() { return new string[] { "v2", "v2" }; } } }
這里的路由設置了配置的標簽{version:apiVersion},其中ApiVersion中有各類的屬性字段,例如:棄用(不代表停用,就好像巨硬上已經過時的方法)該版本API-ApiVersion("1.0", Deprecated = true)],該[ApiVersionNeutral
]標簽就是表明停用,不需要該版本。
配置完成后,可以直接用url訪問不同版本的接口地址:
https://localhost:44383/api/v1/Values
https://localhost:44383/api/v2/Values
最后的配置,因為項目默認啟動的是api/Values接口地址,需要修改項目Properties->launchSettings.json
最終運行效果如下:
2019-10-21 博客園網友反饋的問題
1、運行不成功的項目是 @化身孤島的藍羽 提供的,謝謝!
2、但是樓主寫這篇文章的時候.Net Core preview 8 / 9忘記了,代碼也沒有保留
3、@化身孤島的藍羽反饋根據我的文章步驟,生產的項目無法正常運行,錯誤:
是不是有點懵了,我也懵了,但是不要放棄,方法總比困難多,根據上面的提示,度娘下,更懵沒有解決的方案。
推薦大家用bing、google搜索,這樣更加精致。由於微軟開源,github上直接看aspnet-api-versioning - Issues,估計
很多人會遇到你出現的問題。
其實剛入門的朋友一看,NuGet好像沒有這個版本的Microsoft.AspNetCore.Mvc.Versioning,那應該怎么辦?
項目中打開管理NuGet程序包,選擇你想要了解的組件
點擊下右上角的nuget.org,你就可以找到你想要的版本號信息
如此類推,如下組件都更新到最新版本

把對應,你想要的版本號替換到Version即可,然后項目會重新加載,你再次運行,還是報錯,裴漼不......

搞掂,運行成功
如果是對您有幫助,而您又比較慷概的請微信打賞下(后續會有更多的分享):