ASP.NET Core3.x API版本控制的實現

 更新時間:2020-06-14 00:02:03   作者:佚名   我要評論(0)

前言


一般來說需要更改我們API的時候才考慮版本控制,但是我覺得我們不應該等到那時候來實現它,我們應該有一個版本策略從我們應用程序開發時就開始制定好我們的

前言

一般來說需要更改我們API的時候才考慮版本控制,但是我覺得我們不應該等到那時候來實現它,我們應該有一個版本策略從我們應用程序開發時就開始制定好我們的策略,我們一直遵循著這個策略進行開發。

我們其實可以通過多種方式進行實現我們API版本的控制,其實對于版本控制沒有最好的方式,這完全取決于我們面向的使用者。

API版本控制類型

安裝版本控制包

Install-Package Microsoft.AspNetCore.Mvc.Versioning

在Startup.cs中的ConfigureServices方法中進行版本設置,以及在控制器通過特性進行設置版本,這樣可以實現版本控制。

services.AddApiVersioning(options => {
  options.DefaultApiVersion = new ApiVersion(1, 0);
  options.AssumeDefaultVersionWhenUnspecified = true;
  options.ReportApiVersions = true;
});
  • options.DefaultApiVersion = new ApiVersion(1,0): 這個設置不是必須的,因為默認情況下給我們設置的是1.0,但是顯式的聲明出來是一個很好的習慣,當然DefaultApiVersion它會將默認的[ApiVersion("1.0")]添加到控制器上,也就是說它會隱式的綁定API版本,但是為了我們方便理解或者說方便我們后面開發建議顯式的設置。
  • options.AssumeDefaultVersionWhenUnspecified = true:默認API版本控制需要將其屬性設置為true才可以開啟
  • options.ReportApiVersions = true:默認情況下它是禁用的,啟用此選項后,來自我們API端點的響應將帶有標頭,告訴我們的客戶端支持或不推薦使用哪個版本(api-supported-versions:1.1,2.0, api-deprecated-versions:1.0)

默認提供了四種版本控制方法:

  • 字符串參數
  • 通過HTTP請求頭
  • URL方式
  • 媒體類型(Media Type)

默認方法是使用名為api-version 的查詢字符串參數。我們還可以自己定義一個版本控制規則。

API版本約束方式

字符串參數形式

services.AddApiVersioning(options => 
  options.ApiVersionReader = new QueryStringApiVersionReader("v"));

HTTP請求頭

services.AddApiVersioning(options => 
  options.ApiVersionReader = new HeaderApiVersionReader("api-version"));

組合方式

services.AddApiVersioning(options => {
  options.ApiVersionReader = ApiVersionReader.Combine(
    new QueryStringApiVersionReader("v"),
    new HeaderApiVersionReader("v"));});

URL方式

services.AddApiVersioning(options => options.ApiVersionReader = 
  new UrlSegmentApiVersionReader());

我們可以更改代表版本的參數名稱(例如,在上面的查詢字符串方法中,我們使用字母v代替默認的api-version)。

控制器和方法中添加版本信息

選擇版本控制策略并在ConfigureServices方法中對其配置后,我們可以開始對API端點進行版本控制,我們可以將這些屬性應用于控制器和方法。

  • 控制器的默認可能沒有任何API版本屬性,并隱式配置的默認API版本。默認配置使用值1.0。
  • 使用[ApiVersion("1.0")]屬性注釋我們的控制器,意味著該控制器支持API版本1.0
  • 控制器可以支持多個API版本。只需[ApiVersion(...)]在控制器上應用多個屬性
  • 為了區分控制器支持的多個版本,我們使用[MapToApiVersion()]屬性注釋控制器方法。

如果要使用URL路徑則可以參考如下代碼片段:

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

API控制器棄用,我們只需要設置

[ApiVersion("1.0", Deprecated = true)]

可通過如下方法方式獲取所有API版本信息

var apiVersion = HttpContext.GetRequestedApiVersion();

當然他還支持模型綁定,我們還可以通過模型形式獲取

 [HttpGet]
  public string Get(ApiVersion apiVersion) => $"Controller = {GetType().Name}\nVersion = {apiVersion}";
  }

API版本約束

我們除了在方法和控制器上指定我們的版本,我們還可以采用另一種方式

services.AddApiVersioning( options =>
{
  options.Conventions.Controller<HomeController>().HasApiVersion(1, 0);
});

看如上代碼我們可以看到我們在這里給HomeController配置版本,這樣方便我們集中管理我們的版本。

services.AddApiVersioning( options =>
{
  options.Conventions.Controller<MyController>()  
            .HasDeprecatedApiVersion(1, 0)
            .HasApiVersion(1, 1)
            .HasApiVersion(2, 0)
            .Action(c => c.Get1_0()).MapToApiVersion(1, 0)
            .Action(c => c.Get1_1()).MapToApiVersion(1, 1)
            .Action(c => c.Get2_0()).MapToApiVersion(2, 0);
});

可以同時使用API版本約束和版本控制屬性。

當然我們還可以自定義約束,從.NET Core 3.0開始,有一個IControllerConvention用于此目的的接口。

options.Conventions.Add(new MyCustomConvention());

當然我們還可以通過不同命名空間中的接口進行約束

options.Conventions.Add(new VersionByNamespaceConvention());

比如下面這種文件形式

api/v1/UsersController
api/v2/UsersController
api/v2_1/UsersController

映射后的路徑如下所示

api/1.0/users
api/2.0/users
api/2.1/users

到此這篇關于ASP.NET Core3.x API版本控制的實現的文章就介紹到這了,更多相關ASP.NET Core3.x API版本控制內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

  • ASP.NET Core3.X 終端中間件轉換為端點路由運行詳解
  • ASP.NET Core 3.x 并發限制的實現代碼

相關文章

  • ASP.NET Core3.x API版本控制的實現

    ASP.NET Core3.x API版本控制的實現

    前言 一般來說需要更改我們API的時候才考慮版本控制,但是我覺得我們不應該等到那時候來實現它,我們應該有一個版本策略從我們應用程序開發時就開始制定好我們的
    2020-06-14
  • Asp.net Core中實現自定義身份認證的示例代碼

    Asp.net Core中實現自定義身份認證的示例代碼

    Asp.Net Core中雖然集成了許多常用的身份認證,但很多時候,我們還是需要實現自己的身份認證接口,本文這里就簡單的介紹下如何實現自定義身份認證接口。 首先寫一個
    2020-06-14
  • ASP.NET Core WebAPI實現本地化(單資源文件)

    ASP.NET Core WebAPI實現本地化(單資源文件)

    在Startup ConfigureServices 注冊本地化所需要的服務AddLocalization和 Configure<RequestLocalizationOptions> public void ConfigureServices(IServiceCollec
    2020-06-14
  • 關于.NET Attribute在數據校驗中的應用教程

    關于.NET Attribute在數據校驗中的應用教程

    前言 Attribute(特性)的概念不在此贅述了,相信有點.NET基礎的開發人員都明白,用過Attribute的人也不在少數,畢竟很多框架都提供自定義的屬性,類似于Newtonsoft
    2020-06-14
  • ASP.NET開源導入導出庫Magicodes.IE完成Csv導入導出的方法

    ASP.NET開源導入導出庫Magicodes.IE完成Csv導入導出的方法

    說明 本章主要說明如何使用Magicodes.IE.Csv進行Csv導入導出. 關于Magicodes.IE 導入導出通用庫,通過導入導出DTO模型來控制導入和導出,支持Excel、Word、Pd
    2020-06-14
  • .net core 3.1在iis上發布的踩坑記錄

    .net core 3.1在iis上發布的踩坑記錄

    前言 寫這篇文章的目的是希望像我一樣喜歡.net 的人在發布 core到 iis上時少走點彎路 網上找了些資料,其實實際操作比較簡單,就是有幾個坑很惡心 踩坑記錄 首先是你
    2020-06-14
  • .NET IoC模式依賴反轉(DIP)、控制反轉(Ioc)、依賴注入(DI)

    .NET IoC模式依賴反轉(DIP)、控制反轉(Ioc)、依賴注入(DI)

    依賴倒置原則(DIP) 依賴倒置(Dependency Inversion Principle,縮寫DIP)是面向對象六大基本原則之一。他是指一種特定的的解耦形式,使得高層次的模塊不依賴低層次的
    2020-06-14
  • asp.net mvc core管道及攔截器的理解

    asp.net mvc core管道及攔截器的理解

    今天來看一下asp.net core的執行管道。先看下官方說明: 從上圖可以拋光,asp.net core的執行順序是,當收到一個請求后,request請求會先經過已注冊的中間件,然后
    2020-06-14
  • 聊一聊Asp.net過濾器Filter那一些事

    聊一聊Asp.net過濾器Filter那一些事

    最近在整理優化.net代碼時,發現幾個很不友好的處理現象:登錄判斷、權限認證、日志記錄、異常處理等通用操作,在項目中的action中到處都是。在代碼優化上,這一點是
    2020-06-14
  • xUnit 編寫 ASP.NET Core 單元測試的方法

    xUnit 編寫 ASP.NET Core 單元測試的方法

    還記得 .NET Framework 的 ASP.NET WebForm 嗎?那個年代如果要在 Web 層做單元測試簡直就是災難啊。.NET Core 吸取教訓,在設計上考慮到了可測試性,就連 ASP.NET
    2020-06-14

最新評論

买宝宝用品赚钱吗 重庆快乐十分技巧预测 网上股票如何开户 北京快中彩app 甘肃十一选五遗 号 上海时时乐形态走势 青海省十一选五最新开奖 广东11选5全天杀号 体彩玩法中奖规则 河南福彩22选5开奖 北京pk拾全天计划 兰州外汇配资 湖北快三预测推荐号码 云南时时彩正规吗 排列五杀号技巧 浙江11选5预测推荐 黑龙江22选5开奖结