如何在ASP.NET中利用WebApi实现一个版本控制功能
本篇文章为大家展示了如何在ASP.NET中利用WebApi实现一个版本控制功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
WebApi版本控制的好处
有助于及时推出功能, 而不会破坏现有系统,兼容性处理更友好。
它还可以帮助为选定的客户提供额外的功能。
接下来就来实现版本控制以及在Swagger UI中接入WebApi版本
一、WebApi版本控制实现
通过Microsoft.AspNetCore.Mvc.Versioning实现webapi 版本控制
创建WebApi项目,添加Nuget包:Microsoft.AspNetCore.Mvc.Versioning
Install-PackageMicrosoft.AspNetCore.Mvc.Versioning
修改项目Startup文件,使用Microsoft.AspNetCore.Mvc.Versioning
publicclassStartup { publicStartup(IConfigurationconfiguration) { Configuration=configuration; } publicIConfigurationConfiguration{get;} //Thismethodgetscalledbytheruntime.Usethismethodtoaddservicestothecontainer. publicvoidConfigureServices(IServiceCollectionservices) { //根据需要设置,以下内容 services.AddApiVersioning(apiOtions=> { //返回响应标头中支持的版本信息 apiOtions.ReportApiVersions=true; //此选项将用于不提供版本的请求。默认情况下,假定的API版本为1.0 apiOtions.AssumeDefaultVersionWhenUnspecified=true; //缺省api版本号,支持时间或数字版本号 apiOtions.DefaultApiVersion=newApiVersion(1,0); //支持MediaType、Header、QueryString设置版本号;缺省为QueryString、UrlSegment设置版本号;后面会详细说明对于作用 apiOtions.ApiVersionReader=ApiVersionReader.Combine( newMediaTypeApiVersionReader("api-version"), newHeaderApiVersionReader("api-version"), newQueryStringApiVersionReader("api-version"), newUrlSegmentApiVersionReader()); }); services.AddControllers(); } //Thismethodgetscalledbytheruntime.UsethismethodtoconfiguretheHTTPrequestpipeline. publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv) { if(env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); //使用ApiVersioning app.UseApiVersioning(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints=> { endpoints.MapControllers(); }); } }
WebApi设置版本:
a)通过ApiVersion标记指定指定控制器或方法的版本号;Url参数控制版本(QueryStringApiVersionReader),如下:
namespaceWebAPIVersionDemo.Controllers { [ApiController] [Route("[controller]")] //Deprecated=true:表示v1即将弃用,响应头中返回 [ApiVersion("1.0",Deprecated=true)] [ApiVersion("2.0")]publicclassWeatherForecastController:ControllerBase { privatestaticreadonlystring[]Summaries=new[]{"Freezing","Bracing","Chilly","Cool","Mild","Warm","Balmy","Hot","Sweltering","Scorching"}; [HttpGet] publicIEnumerable<WeatherForecast>Get() { varrng=newRandom(); returnEnumerable.Range(1,5).Select(index=>newWeatherForecast { Date=DateTime.Now.AddDays(index), TemperatureC=rng.Next(-20,55), Summary=$"v1:{Summaries[rng.Next(Summaries.Length)]}" }) .ToArray(); } } }
通过参数api-version参数指定版本号;调用结果:
b)通过Url Path Segment控制版本号(UrlSegmentApiVersionReader):为控制器添加路由方式如下,apiVersion为固定格式
[Route("/api/v{version:apiVersion}/[controller]")]
调用方式:通过调用路径传入版本号,如:http://localhost:5000/api/v1/weatherforecast
c)通过Header头控制版本号:在Startup中设置(HeaderApiVersionReader、MediaTypeApiVersionReader)
apiOtions.ApiVersionReader=ApiVersionReader.Combine( newMediaTypeApiVersionReader("api-version"), newHeaderApiVersionReader("api-version"));
调用方式,在请求头或中MediaType中传递api版本,如下:
其他说明:
a)ReportApiVersions设置为true时, 返回当前支持版本号(api-supported-versions);Deprecated 参数设置为true表示已弃用,在响应头中也有显示(api-deprecated-versions):
b)MapToApiVersion标记:允许将单个API操作映射到任何版本(可以在v1的控制器中添加v3的方法);在上面控制器中添加以下代码,访问v3版本方法
[HttpGet] [MapToApiVersion("3.0")] publicIEnumerable<WeatherForecast>GetV3() { //获取版本 stringv=HttpContext.GetRequestedApiVersion().ToString(); varrng=newRandom(); returnEnumerable.Range(1,1).Select(index=>newWeatherForecast { Date=DateTime.Now.AddDays(index), TemperatureC=rng.Next(-20,55), Summary=$"v{v}:{Summaries[rng.Next(Summaries.Length)]}" }) .ToArray(); }
c)注意事项:
1、路径中参数版本高于,其他方式设置版本
2、多种方式传递版本,只能采用一种方式传递版本号
3、SwaggerUI中MapToApiVersion设置版本不会单独显示
二、Swagger UI中版本接入
1、添加包:Swashbuckle.AspNetCore、Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer
//swaggerui包 Install-PackageSwashbuckle.AspNetCore //api版本 Install-PackageMicrosoft.AspNetCore.Mvc.Versioning.ApiExplorer
2、修改Startup代码:
publicclassStartup { ///<summary> ///Api版本提者信息 ///</summary> privateIApiVersionDescriptionProviderprovider; //Thismethodgetscalledbytheruntime.Usethismethodtoaddservicestothecontainer. publicvoidConfigureServices(IServiceCollectionservices) { services.AddControllers(); //根据需要设置,以下内容 services.AddApiVersioning(apiOtions=> { //返回响应标头中支持的版本信息 apiOtions.ReportApiVersions=true; //此选项将用于不提供版本的请求。默认情况下,假定的API版本为1.0 apiOtions.AssumeDefaultVersionWhenUnspecified=true; //缺省api版本号,支持时间或数字版本号 apiOtions.DefaultApiVersion=newApiVersion(1,0); //支持MediaType、Header、QueryString设置版本号;缺省为QueryString设置版本号 apiOtions.ApiVersionReader=ApiVersionReader.Combine( newMediaTypeApiVersionReader("api-version"), newHeaderApiVersionReader("api-version"), newQueryStringApiVersionReader("api-version"), newUrlSegmentApiVersionReader()); }); services.AddVersionedApiExplorer(option=> { option.GroupNameFormat="接口:'v'VVV"; option.AssumeDefaultVersionWhenUnspecified=true; }); this.provider=services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>(); services.AddSwaggerGen(options=> { foreach(vardescriptioninprovider.ApiVersionDescriptions) { options.SwaggerDoc(description.GroupName, newMicrosoft.OpenApi.Models.OpenApiInfo() { Title=$"接口v{description.ApiVersion}", Version=description.ApiVersion.ToString(), Description="切换版本请点右上角版本切换" } ); } options.IncludeXmlComments(this.GetType().Assembly.Location.Replace(".dll",".xml"),true); }); } //Thismethodgetscalledbytheruntime.UsethismethodtoconfiguretheHTTPrequestpipeline. publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv) { //…… //使用ApiVersioning app.UseApiVersioning(); //启用swaggerui,绑定api版本信息 app.UseSwagger(); app.UseSwaggerUI(c=> { foreach(vardescriptioninprovider.ApiVersionDescriptions) { c.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json",description.GroupName.ToUpperInvariant()); } }); //…… } }
上述内容就是如何在ASP.NET中利用WebApi实现一个版本控制功能,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
ASP.NET怎么实现登出系统并清除Cookie
-
CentOS下怎么实现Mono和Asp.net
CentOS下怎么实现Mono和Asp.net这篇文章主要介绍“C...
-
ASP.NET的Core AD域登录过程怎么实现
ASP.NET的Core AD域登录过程怎么实现本文小编为大家详细...
-
ASP.NET MVC中两个配置文件的作用是什么
-
ASP.NET MVC过滤器执行顺序是什么
-
ASP.NET Core Zero模块系统的示例分析
ASP.NET Core Zero模块系统的示例分析这篇文章主要为...
-
asp.net多级分类统计列表怎么实现
asp.net多级分类统计列表怎么实现本篇内容介绍了“asp.ne...
-
C#怎么用ASP.NET Core开发学生管理系统
-
ASP.net中aspx与cs函数怎么实现互调
ASP.net中aspx与cs函数怎么实现互调,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇...
-
ASP.NET中怎么优化站点构建托管资源
这篇文章将为大家详细讲解有关ASP.NET中怎么优化站点构建托管资源,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完...