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

生活常識發表於2017-09-28

隨著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中用到的點滴技術,分享給大家。

 

相關文章