標籤:creat lin system asp.net nta war windows環境 環境變數 cep
隨著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 的功能相對比較簡單,所以我們還是需要一個反向 Proxy伺服器將 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工程之前,我們要評估一下有哪些具體的遷移工作:
- 引用的Nuget和dll遷移
- Web.Config檔案遷移
- 自訂WebApi路由遷移
- Controller遷移
- HttpModule擴充遷移
- 各類自訂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