1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        ASP.NET Core WebApi版本控制

        共 7599字,需瀏覽 16分鐘

         ·

        2021-02-22 08:05


        前言:

         在日常項(xiàng)目開發(fā)中,隨著項(xiàng)目需求不斷的累加、不斷的迭代;項(xiàng)目服務(wù)接口需要向下兼容歷史版本;前些時(shí)候就因?yàn)锳pi接口為做版本管理導(dǎo)致接口對低版本兼容處理不友好。

         最近就像了解下如何實(shí)現(xiàn)WebApi版本控制,那么版本控制有什么好處呢?

         WebApi版本控制的好處

        • 有助于及時(shí)推出功能, 而不會破壞現(xiàn)有系統(tǒng),兼容性處理更友好。

        • 它還可以幫助為選定的客戶提供額外的功能。

         接下來就來實(shí)現(xiàn)版本控制以及在Swagger UI中接入WebApi版本

        一、WebApi版本控制實(shí)現(xiàn)

          通過Microsoft.AspNetCore.Mvc.Versioning?實(shí)現(xiàn)webapi 版本控制

        • 創(chuàng)建WebApi項(xiàng)目,添加Nuget包:Microsoft.AspNetCore.Mvc.Versioning

        Install-Package Microsoft.AspNetCore.Mvc.Versioning
        • 修改項(xiàng)目Startup文件,使用Microsoft.AspNetCore.Mvc.Versioning?

        public class Startup
        {
        public Startup(IConfiguration configuration)
        {
        Configuration
        = configuration;
        }
        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
        //根據(jù)需要設(shè)置,以下內(nèi)容
        services.AddApiVersioning(apiOtions =>
        {
        //返回響應(yīng)標(biāo)頭中支持的版本信息
        apiOtions.ReportApiVersions = true;
        //此選項(xiàng)將用于不提供版本的請求。默認(rèn)情況下, 假定的 API 版本為1.0
        apiOtions.AssumeDefaultVersionWhenUnspecified = true;
        //缺省api版本號,支持時(shí)間或數(shù)字版本號
        apiOtions.DefaultApiVersion = new ApiVersion(1, 0);
        //支持MediaType、Header、QueryString 設(shè)置版本號;缺省為QueryString、UrlSegment設(shè)置版本號;后面會詳細(xì)說明對于作用
        apiOtions.ApiVersionReader = ApiVersionReader.Combine(
        new MediaTypeApiVersionReader("api-version"),
        new HeaderApiVersionReader("api-version"),
        new QueryStringApiVersionReader("api-version"),
        new UrlSegmentApiVersionReader());
        });
        services.AddControllers();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
        if (env.IsDevelopment())
        {
        app.UseDeveloperExceptionPage();
        }
        app.UseHttpsRedirection();

        //使用ApiVersioning
        app.UseApiVersioning();

        app.UseRouting();
        app.UseAuthorization();
        app.UseEndpoints(endpoints
        =>
        {
        endpoints.MapControllers();
        });
        }
        }

        • WebApi設(shè)置版本:

          a)通過ApiVersion標(biāo)記指定指定控制器或方法的版本號;Url參數(shù)控制版本(QueryStringApiVersionReader),如下:

        namespace WebAPIVersionDemo.Controllers
        {
        [ApiController]
        [Route(
        "[controller]")]
        //Deprecated=true:表示v1即將棄用,響應(yīng)頭中返回
        [ApiVersion("1.0", Deprecated = true)]
        [ApiVersion(
        "2.0")]public class WeatherForecastController : ControllerBase
        {
        private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};

        [HttpGet]
        public IEnumerable Get()
        {
        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
        Date
        = DateTime.Now.AddDays(index),
        TemperatureC
        = rng.Next(-20, 55),
        Summary
        = $"v1:{Summaries[rng.Next(Summaries.Length)]}"
        })
        .ToArray();
        }

        }
        }

          通過參數(shù)api-version參數(shù)指定版本號;調(diào)用結(jié)果:

          

          b)通過Url Path Segment控制版本號(UrlSegmentApiVersionReader):為控制器添加路由方式如下,apiVersion為固定格式  

        [Route("/api/v{version:apiVersion}/[controller]")]

          調(diào)用方式:通過調(diào)用路徑傳入版本號,如:http://localhost:5000/api/v1/weatherforecast

           

          c)通過Header頭控制版本號:在Startup中設(shè)置(HeaderApiVersionReader、MediaTypeApiVersionReader

        apiOtions.ApiVersionReader = ApiVersionReader.Combine(
        new MediaTypeApiVersionReader("api-version"),
        new HeaderApiVersionReader("api-version"));

        ?  調(diào)用方式,在請求頭或中MediaType中傳遞api版本,如下:

           

        ?   

        • 其他說明:

            a)ReportApiVersions設(shè)置為true時(shí), 返回當(dāng)前支持版本號(api-supported-versions);Deprecated 參數(shù)設(shè)置為true表示已棄用,在響應(yīng)頭中也有顯示(api-deprecated-versions):

            

            b)MapToApiVersion標(biāo)記:允許將單個(gè) API 操作映射到任何版本(可以在v1的控制器中添加v3的方法);在上面控制器中添加以下代碼,訪問v3版本方法

        [HttpGet]
        [MapToApiVersion(
        "3.0")]
        public IEnumerable GetV3()
        {
        //獲取版本
        string v = HttpContext.GetRequestedApiVersion().ToString();
        var rng = new Random();
        return Enumerable.Range(1, 1).Select(index => new WeatherForecast
        {
        Date
        = DateTime.Now.AddDays(index),
        TemperatureC
        = rng.Next(-20, 55),
        Summary
        = $"v{v}:{Summaries[rng.Next(Summaries.Length)]}"
        })
        .ToArray();
        }

            

        ?   c)注意事項(xiàng):

            1、路徑中參數(shù)版本高于,其他方式設(shè)置版本

            2、多種方式傳遞版本,只能采用一種方式傳遞版本號

            3、SwaggerUI中MapToApiVersion設(shè)置版本不會單獨(dú)顯示    

        二、Swagger UI中版本接入

         1、添加包:Swashbuckle.AspNetCore、Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer   

        //swaggerui 包
        Install-Package Swashbuckle.AspNetCore
        //api版本
        Install-Package Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer

         2、修改Startup代碼:

        public class Startup
        {
        ///
        /// Api版本提者信息
        ///

        private IApiVersionDescriptionProvider provider;

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
        services.AddControllers();

        //根據(jù)需要設(shè)置,以下內(nèi)容
        services.AddApiVersioning(apiOtions =>
        {
        //返回響應(yīng)標(biāo)頭中支持的版本信息
        apiOtions.ReportApiVersions = true;
        //此選項(xiàng)將用于不提供版本的請求。默認(rèn)情況下, 假定的 API 版本為1.0
        apiOtions.AssumeDefaultVersionWhenUnspecified = true;
        //缺省api版本號,支持時(shí)間或數(shù)字版本號
        apiOtions.DefaultApiVersion = new ApiVersion(1, 0);
        //支持MediaType、Header、QueryString 設(shè)置版本號;缺省為QueryString設(shè)置版本號
        apiOtions.ApiVersionReader = ApiVersionReader.Combine(
        new MediaTypeApiVersionReader("api-version"),
        new HeaderApiVersionReader("api-version"),
        new QueryStringApiVersionReader("api-version"),
        new UrlSegmentApiVersionReader());
        });


        services.AddVersionedApiExplorer(option
        =>
        {
        option.GroupNameFormat = "接口:'v'VVV";
        option.AssumeDefaultVersionWhenUnspecified = true;
        });

        this.provider = services.BuildServiceProvider().GetRequiredService();
        services.AddSwaggerGen(options =>
        {
        foreach (var description in provider.ApiVersionDescriptions)
        {
        options.SwaggerDoc(description.GroupName,
        new Microsoft.OpenApi.Models.OpenApiInfo()
        {
        Title = $"接口 v{description.ApiVersion}",
        Version = description.ApiVersion.ToString(),
        Description = "切換版本請點(diǎn)右上角版本切換"
        }
        );
        }
        options.IncludeXmlComments(this.GetType().Assembly.Location.Replace(".dll", ".xml"), true
        );
        });


        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
        //……

        //使用ApiVersioning
        app.UseApiVersioning();

        //啟用swaggerui,綁定api版本信息
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        {
        foreach (var description in provider.ApiVersionDescriptions)
        {
        c.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
        }
        });


        //……
        }
        }

         

        其他: 

         示例地址:https://github.com/cwsheng/WebAPIVersionDemo


        往期精彩回顧




        【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程?★★★

        .NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃

        【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引

        Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

        .NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動態(tài)選擇看這篇就夠了

        10個(gè)小技巧助您寫出高性能的ASP.NET Core代碼

        用abp vNext快速開發(fā)Quartz.NET定時(shí)任務(wù)管理界面

        在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度

        現(xiàn)身說法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

        關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

        C#異步編程看這篇就夠了


        瀏覽 44
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            岛国电影av | 蜜桃AV秘 无码一区二区三区 | 少妇一区二区三区免费观看 | 红桃精品91一区二区久 | 啊轻点灬太粗嗯太深了用力视频 | 亚洲第一网站在线观看 | 成年人午夜电影 | 97人妻人人做人碰人人添图片 | 小坏蛋再深点灬舒服灬太久了视频 | 蜜臀久久99精品久久久画质超高清 |