本文转载请联系码农阅读公众号。WebAPI的版本控制可以尝试确保一个API的多个版本都保存在同一个url下。通常,一个webapi会有多个客户端。这些客户端包括:app、web、html5、crawl等同构或异构平台。API升级后,往往会保留升级前的API。维护两个API是一个不小的挑战。毕竟还有一些客户端用户需要访问旧的API。这时候就需要对webapi进行版本控制。安装Versioning包要使用webapi的版本控制功能,需要使用nuget引用Microsoft.AspNetCore.Mvc.Versioning包。也可以通过VisualStudio2019的NuGet包管理器可视化界面安装或者通过NuGet包管理器命令行工具输入如下命令:在Startup.ConfigureServices中可以在容器中注入ApiVersioning,如下代码所示:调用AddApiVersioning()时。除了这个默认的方法,你还可以做一些全局的配置,如下代码所示:.AssumeDefaultVersionWhenUnspecified=true;v.DefaultApiVersion=newApiVersion(1,0);});}}首先使用QueryString指定版本号查看代码,考虑以下api。[ApiController][ApiVersion("2.0")][Route("api/[controller]")]publicclassWeatherForecastController:ControllerBase{privatestaticreadonlystring[]Summaries=new[]{"Freezing","Bracing","Chilly","Cool","温和","温暖","温和","热","闷热","灼热"};[HttpGet]publicIEnumerableGet(){varrng=newRandom();returnEnumerable.Range(1,5).Select(index=>newWeatherForecast{Date=DateTime.Now.AddDays(index),TemperatureC=rng.Next(-20,55),Summary=Summaries[rng.Next(Summaries.Length)]}).ToArray();}}从代码中可以看出,我在WeatherForecastController上将Controller标记为v2.0,接下来怎么访问呢?可以使用以下链接:http://localhost:61582/api/weatherforecast?api-version=2.0看到这里,有小伙伴产生了疑惑。v2.0的Get是可用的,那v1.0的Get怎么访问呢?实际开发中的做法是这样的,会使用两个namespace来表示对应的版本号,可以看如下代码:namespaceWebApplication6.Controllers.v1{[ApiController][ApiVersion("1.0")][Route("api/[controller]")]publicclassWeatherForecastController:ControllerBase{privatestaticreadonlystring[]Summaries=new[]{"冷冻","支撑","寒冷","酷","温和","温暖","温和","热","闷热","灼热"};privatereadonlyILogger_logger;publicWeatherForecastController(ILoggerlogger){_logger=logger;}[HttpGet]publicIEnumerableGet(){varrng=newRandom();returnEnumerable.Range(1,5).Select(index=>newWeatherForecast{Date=DateTime.Now.AddDays(index),TemperatureC=rng.Next(-20,55),Summary=Summaries[rng.Next(Summaries.Length)]}).ToArray();}}}namespaceWebApplication6.Controllers.v2{[ApiController][ApiVersion("2.0")][Route("api/[controller]")]publicclassWeatherForecastController:ControllerBase{privatestaticreadonlystring[]Summaries=new[]{“自由ezing","Bracing","Chilly","Cool","Mild","Warm","Balmy","Hot","Swetering","Scorching"};privatereadonlyILogger_logger;publicWeatherForecastController(ILoggerlogger){_logger=logger;}[HttpGet]publicIEnumerableGet(){varrng=newRandom();returnEnumerable.Range(1,5).Select(index=>newWeatherForecast{Date=DateTime.Now.AddDays(index),TemperatureC=rng.Next(-20,55),Summary=Summaries[rng.Next(Summaries.Length)]}).ToArray();}}}从上面的代码可以看出WebApplication6.Controllers.v1表示v1.0版本,WebApplication6.Controllers.v2表示v2.0版本,接下来依次浏览这两个url,使用routes指定版本号,显然QueryString的使用方式不是很优雅,不符合Restful规范,接下来,让我们看看如何使用RouteRetrofit,考虑下面的类,注意我是如何在路由中进行版本控制的。[ApiController][ApiVersion("1.0")][Route("api/v{version:apiVersion}/[controller]")]publicclassWeatherForecastController:ControllerBase{privatestaticreadonlystring[]Summaries=new[]{"冻结","支撑""Chilly","Cool","Mild","Warm","Balmy","Hot","Sweltering","Scorching"};[HttpGet]publicIEnumerableGet(){varrng=newRandom();returnEnumerable.Range(1,5).Select(index=>newWeatherForecast{Date=DateTime.Now.AddDays(index),TemperatureC=rng.Next(-20,55),Summary=Summaries[rng.Next(总结。Length)]}).ToArray();}}在这里,我将[Route("api/[controller]")]替换为[Route("api/v{version:apiVersion}/[controller]")],并且然后运行工程,如下图所示:IgnoreAPIversionAPIversioning时,有些API可能只需要一个版本。这时候可以使用ApiVersionNeutral特性来忽略版本控制,如下代码所示:[ApiVersionNeutral][Route("api/[controller]")][ApiController]publicclassWeatherForecastController:ControllerBase{privatestaticreadonlystring[]Summaries=new[]{"冷冻","支撑","寒冷","酷","温和","温暖","温和","热","闷热","灼热"};[HttpGet]publicIEnumerableGet(){varrng=newRandom();returnEnumerable.Range(1,5).Select(index=>newWeatherForecast{Date=DateTime.Now.AddDays(index),TemperatureC=rng.Next(-20,55),Summary=Summaries[rng.Next(Summaries.Length)]}).ToArray();}}原文链接:https://www.infoworld.com/article/3433156/advanced-版本化-in-aspnet-core-web-api.html