1. 程式人生 > >WebApi遷移ASP.NET Core2.0

WebApi遷移ASP.NET Core2.0

content .config true 進入 服務 設置 網關 系統 win

WebApi遷移ASP.NET Core2.0

一步一步帶你做WebApi遷移ASP.NET Core2.0

隨著ASP.NET Core 2.0發布之後,原先運行在Windows IIS中的ASP.NET WebApi站點,就可以跨平臺運行在Linux中。我們有必要先說一下ASP.NET Core。

ASP.NET Core 是新一代的 ASP.NET,第一次出現時的代號為 ASP.NET vNext,後來命名為ASP.NET 5,隨著它的完善與成熟,最終命名為 ASP.NET Core,這表明它已不是 ASP.NET 的升級,而是一個重新設計的Web開發框架。而它一個非常重要的變化就是它不再依賴於IIS,而是一個獨立的自寄宿的控制臺應用程序,這也是它可以跨平臺的根本。

兩個關鍵詞:IIS解耦和獨立自寄宿的控制臺應用程序。

我們對比一下ASP.NET和ASP.NET Core。ASP.NET 是強依賴於Windows IIS的,因為System.Web 中有很多方法都是直接調用的 IIS相關的 API,同時它還是駐留在IIS進程中的。然而 ASP.NET Core 運行時則是一個完全獨立的控制臺應用程序,它有自己的 Kestrel Server,可以直接對外部提供服務。不過當前已有的 Kestrel Server 的功能相對比較簡單,所以我們還是需要一個反向代理服務器將 Kestrel 服務器保護起來。因此,部署在Linux環境下,可以考慮Nginx+Kestrel Server的組合,Windows環境下,支持和IIS的直接集成(UseIISIntegration),部署在IIS中。

我們進入今天的主題,將原有ASP.NET WebApi工程遷移到ASP.NET Core 2.0.

一、ASP.NET Core WebApi工程

打開VS2017(版本一定要大於15.3),新建項目:ASP.NET Core Web應用程序

技術分享

技術分享

新建後的解決方案和工程:

技術分享

二、ASP.NET Core WebHost構造和運行

大家可以發現,有了Program.cs類,有了Main函數,控制臺應用程序就可以運行了。

技術分享

繼續看,構造並啟動了一個WebHost. 疑問來了,WebHost是什麽機制?如果構造的?

WebHost.CreateDefaultBuilder是在ASP.NET Core 2.0中新增的,在Microsoft.AspNetCore命名空間下。我們看一下CreateDefaultBuilder的源碼:

技術分享

整個WebHost對象的構造過程是這樣的:

1. 註冊 Kestrel 中間件,指定當前WebHost 要使用的 Server(HTTP服務器)。

2. 設置 Content 根目錄,將當前項目的根目錄作為 ContentRoot 的目錄。

3. 讀取 appsettinggs.json 配置文件,開發環境下的 UserSecrets 以及環境變量和命令行參數。

4. 讀取配置文件中的 Logging 節點,對日誌系統進行配置。

5. 添加 IISIntegration 中間件,集成到IIS中運行。

6. 設置開發環境下, ServiceProvider 的 ValidateScopes 為 true,避免直接在 Configure 方法中獲取 Scope 實例。

7. 指定 Startup 類,通過 Build 方法創建 WebHost 對象。

Main函數中,BuildWebHost(args).Run(); 運行創建好的WebHost。

三、調試運行

技術分享

ValuesController中的Action實現:

技術分享

四、ASP.NET WebApi遷移評估

在真正遷移ASP.NET WebApi工程之前,我們要評估一下有哪些具體的遷移工作:

  1. 引用的Nuget和dll遷移
  2. Web.Config文件遷移
  3. 自定義WebApi路由遷移
  4. Controller遷移
  5. HttpModule擴展遷移
  6. 各類自定義Attribute遷移

我們服務網關用的WebApi主要涉及上述6個部分,大家可以根據實際情況增加和刪除。

五、一步一步遷移ASP.NET Core WebApi

1. 遷移之前首先要建立一個空的ASP.NET Core2.0 WebApi項目:

技術分享

技術分享

2. 遷移Controller和Model

在新建的工程中復刻已有的Controller和Model的,例如:

技術分享

3. 遷移各類Attribute,屬性標簽,例如:本例中的自定義異常處理標簽

技術分享

4. 遷移Web.Config

為了更好的兼容.NET 原有的配置文件和配置系統。雖然提供了Nuget:

System.Configuration.ConfigurationManager

但是實際上,Web.Config是為了IIS而設計的,在新的ASP.NET Core中推薦使用appSettings.json替換改造。即:將XML化的配置文件修改為JSON配置文件。

核心的NameSpace:Microsoft.Extensions.Configuration

具體可以參考微軟的官方資料:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration

技術分享

配置讀取示例:

技術分享

5. WebApi自定義路由重寫

在很多WebApi項目中,采用了自定義路由,例如我們的CommonController,自定義路由在ASP.NET Core2.0中如何支持的呢?

在StartUp類中,提供Configure方法:

技術分享

在這裏,我們加入自定義路由配置,對應我們剛才的CommonController:

技術分享

6. IHttpModule擴展遷移ASP.NET Core2.0

在ASP.NET Core2.0中提供了中間件的概念,支持請求和響應之間的鏈式擴展:

技術分享

具體可以參考微軟官方資料:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware

https://docs.microsoft.com/en-us/aspnet/core/migration/http-modules

這裏,示例一下我們自己寫的自定義中間件:

技術分享

這裏巧妙的通過擴展方法的方式,擴展了接口IApplicationBuilder,

同時在StartUp的Configure方法中加載擴展的自定義中間件:

技術分享

以上就是我們在將WebApi站點遷移到ASP.NET Core2.0中用到的點滴技術,分享給大家。

周國慶

2017/9/28

WebApi遷移ASP.NET Core2.0