溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

.NET如何實現(xiàn)API版本控制

發(fā)布時間:2022-07-07 09:47:35 來源:億速云 閱讀:88 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下.NET如何實現(xiàn)API版本控制的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    1. 優(yōu)點

    • 有助于保護(hù)原有系統(tǒng),不受影響,并及時修改問題

    • 可以實現(xiàn)用戶的私人定制(比如是付費接口)

    • 快速迭代

    2. API版本控制

    • 在URL中追加版本或者作為查詢字符串參數(shù)

    • 通過自動以標(biāo)頭和通過接受標(biāo)頭

    2.1 安裝組件

    ASP.NET API versioning為您提供了一種功能強大但易于使用的方法,用于將API版本控制語義添加到使用ASP.NET構(gòu)建的新的和現(xiàn)有的REST服務(wù)中。API版本控制擴(kuò)展定義了簡單的元數(shù)據(jù)屬性和約定,用于描述您的服務(wù)實現(xiàn)了哪些API版本。

        <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.2.0" />
        <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="4.2.0" />
    2.1.1 常用配置
    [ApiVersion("1.1")] //設(shè)置版本號
    [ApiVersionNeutral]//退出版本控制
    [MapToApiVersion("1.1")] //設(shè)置獨立版本
    [ApiVersion("1.0", Deprecated = true)]//api版本已經(jīng)被棄用
    HttpContext.GetRequestedApiVersion().ToString(); //訪問版本信息

    2.2 QueryString來實現(xiàn)版本控制

    2.2.1 ConfigureServices中配置
                //Versioning用來實現(xiàn)API的版本控制
                services.AddApiVersioning(options =>
                {
                    options.DefaultApiVersion = new ApiVersion(1, 1);//默認(rèn)版本號
                    options.AssumeDefaultVersionWhenUnspecified = true;//此選項將用于不提供版本的請求,默認(rèn)情況下假定API的版本為1.0
                    options.ReportApiVersions = true;//當(dāng)設(shè)置為true時候,api將返回響應(yīng)標(biāo)頭中支持的版本信息
                    //下面這句默認(rèn)不寫也可以
                    //options.ApiVersionReader = new QueryStringApiVersionReader(parameterNames: "api-version");//該名稱用于查詢時候使用
                });
    2.2.2 控制器設(shè)置版本
    namespace NetCore_SwaggerVersion.Controllers.v1
    {
        /// <summary>
        /// 版本1.1
        /// </summary>
        [Route("api/[controller]")]
        [ApiController]
        [ApiVersion("1.1")]//可以設(shè)置多個
        [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

    不同命名空間下可以存在相同的控制器

    2.2.3 特定方法設(shè)置版本
    [MapToApiVersion("1.1")]
    [HttpGet]
    public IEnumerable<string> Get()
    2.2.4 設(shè)置不受版本控制
        [ApiVersionNeutral]//退出版本控制
        [ApiController]
        [Route("api/[controller]/[action]")]
        public class WeatherForecastController : ControllerBase
    2.3.5 訪問地址
    http://localhost:5000/api/WeatherForecast/Get //不寫版本號的話走的是默認(rèn)的版本號
    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

    2.3 URL Path Segment來實現(xiàn)版本控制

    2.3.1 ConfigureServices中配置
                //Versioning用來實現(xiàn)API的版本控制
                services.AddApiVersioning(options =>
                {
                    options.DefaultApiVersion = new ApiVersion(1, 1);//默認(rèn)版本號
                    options.AssumeDefaultVersionWhenUnspecified = true;//此選項將用于不提供版本的請求,默認(rèn)情況下假定API的版本為1.0
                    options.ReportApiVersions = true;//當(dāng)設(shè)置為true時候,api將返回響應(yīng)標(biāo)頭中支持的版本信息
                });
    2.3.2 控制器設(shè)置版本
    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

    不同命名空間下可以存在相同的控制器

    2.3.3 特定方法設(shè)置版本
    [MapToApiVersion("1.1")]
    [HttpGet]
    public IEnumerable<string> Get()
    2.3.4 設(shè)置不受版本控制
        [ApiVersionNeutral]//退出版本控制
        [ApiController]
        [Route("api/[controller]/[action]")]
        public class WeatherForecastController : ControllerBase
    2.3.5 訪問地址
    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 不受版本控制

    2.4 HTTP Headers來實現(xiàn)版本控制

    2.4.1 ConfigureServices中配置
                //Versioning用來實現(xiàn)API的版本控制
                services.AddApiVersioning(options =>
                {
                    options.DefaultApiVersion = new ApiVersion(1, 1);//默認(rèn)版本號
                    options.AssumeDefaultVersionWhenUnspecified = true;//此選項將用于不提供版本的請求,默認(rèn)情況下假定API的版本為1.0
                    options.ReportApiVersions = true;//當(dāng)設(shè)置為true時候,api將返回響應(yīng)標(biāo)頭中支持的版本信息
                    //header傳遞版本信息
                    options.ApiVersionReader = new HeaderApiVersionReader("version");
                    options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options);//如果沒有傳輸版本號,那么會使用最大版本號  LowestImplementedApiVersionSelector是最小版本號
                    options.UseApiBehavior = false;//是否使用API行為
                });
    2.4.2 控制器設(shè)置版本
    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

    不同命名空間下可以存在相同的控制器

    2.4.3 特定方法設(shè)置版本
    [MapToApiVersion("1.1")]
    [HttpGet]
    public IEnumerable<string> Get()
    2.4.4 設(shè)置不受版本控制
        [ApiVersionNeutral]//退出版本控制
        [ApiController]
        [Route("api/[controller]/[action]")]
        public class WeatherForecastController : ControllerBase
    2.4.5 訪問地址
    http://localhost:5000/api/Test  //需要在headers里面增加 version: 1.1
    http://localhost:5000/api/WeatherForecast/Get 不受版本控制

    2.5 同時支持多種模式

    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"));
        //或者
        //同時支持查詢字符串和標(biāo)頭
        o.ApiVersionReader = new QueryStringOrHeaderApiVersionReader(parameterName: "version"){HeaderNames = { "api-version", "x-ms-version" }}
    });

    2.6 不借助包,封裝文件

        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
                    };
                }
            }
        }

    調(diào)試代碼發(fā)現(xiàn)這種方式只在程序第一次運行的時候會執(zhí)行,之后不會再執(zhí)行多次,因此效率很高。

    以上就是“.NET如何實現(xiàn)API版本控制”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    api
    AI