WebApi遷移ASP.NET Core2.0
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工程之前,我們要評估一下有哪些具體的遷移工作:
- 引用的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