前言:在這篇文章中我們來看看ASP.Net Core 3.0應用程序中一些基本的部分—— .csproj項目文件和Program.cs文件。我將會介紹它們從 ASP.NET Core 2.x 中的默認模板的一些變化,並討論一些API 的更改。
翻譯:Andrew Lock https://andrewlock.net/exploring-the-new-project-file-program-and-the-generic-host-in-asp-net-core-3/
探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs
探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation
探索ASP.Net Core 3.0系列四:在ASP.NET Core 3.0的應用中啟動時運行異步任務
探索 ASP.Net Core 3.0系列五:引入IHostLifetime並弄清Generic Host啟動交互
探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性啟動信息中的結構化日志
一、介紹
我們知道.Net Core 3.0在9月23日正式發布,大家已經開始在生產環境中開始使用了,下面讓我們看一些基礎結構上的變化:
(1)Microsoft.AspNetCore.App NuGet上已經不在提供。
(2)ASP.Net Core 現在是基於generic host,而不是Web Host。
如果你的ASP.Net Core 2.x 想升級到ASP.Net Core 3.0,請參考該文章:https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio
在這篇文章中我們關注的是新 創建的ASP.Net Core 應用中的..csproj 和 Program.cs 文件,后面的文章我們將會比較Startup.cs是如何從2.x變化過來的以及各種不同模板的變化(比如 web webapi mvc 等)。
二、新的.csproj 和shared framework的變化
我們新建一個ASP.Net Core 項目,打開.csproj 文件,我們將看到以下變化:
如果將此與 2.x 中 ASP.NET Core 應用的項目文件進行比較,則存在各種相似之處和差異:
(1)<TargetFramework> 是netcoreapp3.0,而不是 netcoreapp2.1 或者2.2,這是因為我們創建的是.Net Core 3.0的項目而不是 2.1/2.2。
(2)<Project>元素中的 SDK 仍然是 Microsoft.Net.Sdk.Web。
(3)不在引用 Microsoft.AspNetCore.App meta package。
(4)最后一點是最有趣的變化。在ASP.Net core2.1/2.2中,你可以引用"共享框架"元包,Microsoft.AspNetCore.App。共享框架提供了許多好處,例如允許您避免在應用中手動安裝所有單個包等。
借助.Net core 3.0中,微軟不在將共享框架作為Nuget包而發布,所以不在有Microsoft.AspNetCore.App version 3.0.0 ,共享框架仍像以前那樣隨 .NET Core 一起安裝,但在 3.0 中引用它的方式不同。
在 ASP.NET Core 2.x 中,為了引用共享框架,您將向項目文件添加以下內容:
<ItemGroup> <PackageReference Include="Microsoft.AspNetCore.App" /> </ItemGroup>
相反,在3.0中,你可以用<FrameworkReference> 元素 來引用:
<ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup>
細心的同學可能會說,為什么我新創建的ASP.Net Core 項目文件中已經存在 Microsoft.AspNetCore.App,其實,在.Net core 3.0中 SDK Microsoft.Net.Sdk.Web中已經包含了它。
三、不再為共享框架組件提供包
在3.0中的一個重大變化是 ,您無法再安裝單個 NuGet 包,這些包本來是共享框架的一部分,例如,在ASP.NET Core 2.x 中,您可以依賴單個包,如 Microsoft.AspNetCore.Authentication、Microsoft.AspNetCore.Identity,而不是依賴於整個框架,部分 截圖 如下:
具體可以參考這篇文章 :https://github.com/aspnet/AspNetCore/issues/3756
這通常對庫最有用,因為應用總是依賴於共享框架,但是,在 .NET Core 3.0 中,這不再可能。這些 NuGet 軟件包不再提供,相反,如果需要引用這些庫中的任何一個,則必須從類庫中向項目文件添加<FrameworkReference>元素。需要注意的另一件事是,某些包(例如 EF Core 和社交身份驗證提供程序)不再是共享框架的一部分。如果需要使用這些包,您必須在項目中手動安裝 NuGet 包。
有關應用包的完整列表,請參閱 https://github.com/aspnet/AspNetCore/issues/3755
部分截圖 如下:
四、.Net Core 3.0中的Program.cs
我們瞥一眼感覺 ASP.Net Core 3.0 中的Program.cs與.NET Core 2.x 的版本非常相似,但實際上許多類型都已更改。這是因為在 .NET Core 3.0 中,ASP.NET Core 已重建為在Generic Host,上運行,而不是使用單獨的 WebHost。
從上面的圖來看 ,確實存在明顯的差別,通用主機在 2.1 中引入,這是一個很好的想法,但是問題很多,它為庫創建了更多的工作,幸好在3.0 中的此更改應該可以解決這些問題。
在大多數情況下,最終使用的習慣與您在 .NET Core 2.x 非常相似,但它分為兩個邏輯步驟,而不是為應用配置所有內容的單個方法 WebHost.CreateDefaultBuilder(),它有兩個單獨的方法調用:
(1)Host.CreateDefaultBuilder():作用是配置app的 配置項、日志、以及依賴注入容器。
(2)IHostBuilder.ConfigureWebHostDefaults():作用是可以添加ASP.Net core 應用所需的一切,比如 :配置Kestrel 、使用Startup.cs 去配置DI容器和中間件管道。
五、generic host builder
正如我已經提到的,通用主機構成了構建ASP.NET Core 3.0 應用程序的基礎。它提供了在ASP.NET Core應用中使用的基本元素Microsoft.Extensions.*,比如:日志記錄、配置和依賴項注入。
下面的代碼是 Host.CreateDefaultBuilder() 方法的簡化版本。它類似於 WebHost.CreateDefaultBuilder() 方法,但有一些有趣的變化,我稍后將討論。
public static IHostBuilder CreateDefaultBuilder(string[] args) { var builder = new HostBuilder(); builder.UseContentRoot(Directory.GetCurrentDirectory()); builder.ConfigureHostConfiguration(config => { // Uses DOTNET_ environment variables and command line args }); builder.ConfigureAppConfiguration((hostingContext, config) => { // JSON files, User secrets, environment variables and command line arguments }) .ConfigureLogging((hostingContext, logging) => { // Adds loggers for console, debug, event source, and EventLog (Windows only) }) .UseDefaultServiceProvider((context, options) => { // Configures DI provider validation }); return builder; }
總之,和2.x相比較有一下不同:
- 使用DOTNET_ 前綴進行環境變量托管配置。
- 使用命令行變量進行宿主配置。
- 添加事件源記錄器和事件日志記錄器提供程序。
- 可選啟用ServiceProvider 驗證
- 不配置特定於 WebHosting。
(1)第一個興趣點是主機配置的設置方式,對於 Web 主機配置使用的環境變量默認為 ASPNETCORE_,因此,設置 ASPNETCORE_ENVIRONMENT將設置環境配置值。對於generic host前綴現在是 DOTNET_,以及運行時傳遞給應用程序的任何命令行參數。主機配置控制應用程序在運行的托管環境等內容,並且與應用配置(通常與 IOptions 接口一起使用)是分開的。
(2)該方法主要是配置你的應用程序,ConfigureAppConfiguration()沒有改變,它仍然使用appsettings.json 文件,和一個appsettings.ENV.json 文件、user secrets、環境變量和命令行參數。
(3)通用主機的日志記錄部分已在 3.0 中展開,它仍通過應用配置配置日志級篩選,並添加控制台和調試記錄器提供程序。但是,它還添加了EventSource logging provider,它被用於OS日志記錄系統(如 Windows 上的 ETW 和 Linux 上的 LTTng)接口。此外,僅在 Windows 上,記錄器會添加 Event Log provider,,以便寫入 Windows 事件日志。
最后,generic host配置依賴項注入容器以便在開發環境中運行時驗證作用域,就像在 2.x 中所做的那樣。其目的是捕獲依賴項的實例,其中將范圍服務注入到 Singleton 服務。中在 3.0 中,通用主機還啟用 ValidateOnBuild,這是我在后續帖子中將介紹的功能。
通用主機的一個關鍵點是它是通用的,也就是說,它與ASP.NET Core 或 HTTP 工作負載沒有任何具體關系。您可以將通用主機用作創建控制台應用或長期服務以及典型ASP.NET Core 應用的基礎。為了說明這一點,在 3.0 中,您有一個附加方法--ConfigureWebHostDefaults().
六、使用ConfigureWebHostDefaults 恢復ASP.NETCore功能
這篇文章已經很長了,所以我不會在這里講很多細節,但是ConfigureWebHostDefaults
擴展方法用於在通用主機的功能之上添加ASP.NETCore"層"。在最簡單的級別上,這涉及到將 Kestrel Web 服務器添加到主機,但還有其他一些更改。以下是該方法提供的概述(包括GenericWebHostBuilder提供的功能):
- 將 ASPNETCORE_前綴環境變量添加到主機配置(除了 DOTNET_ 前綴變量和命令行參數)。
- 添加GenericWebHostService,這是一個實現了IHostService接口的類,實際上運行在ASP.NET Core server,這是使ASP.NET Core可以重用通用主機的主要功能。
- 添加了一個附加的應用程序配置源,StaticWebAssetsLoader,用於處理Razor UI類庫中的靜態文件(css / js)。
- 使用默認值(與2.x相同)配置Kestrel
- 添加HostFilteringStartupFilter(與2.x相同)
- 如果ForwardedHeaders_Enabled配置值為true,即ASPNETCORE_FORWARDEDHEADERS_ENABLED環境變量為true,則添加ForwardedHeadersStartupFilter。
- 在Windows上啟用IIS集成。
- 將端點路由服務(endpoint routing)添加到DI容器。
(1)其中的大部分與ASP.NET Core 2.x中的相同,不同之處在於:用於將應用程序作為IHostedService運行的基礎結構; 端點路由,此路由在3.0中全局啟用(而不是僅在2.2中針對MVC / Razor Pages啟用); 和ForwardedHeadersStartupFilter。
(2)ForwardedHeadersMiddleware從1.0開始就存在,在將應用程序托管在代理之后時必不可少,以確保您的應用程序能夠處理SSL卸載並正確生成URL。 所更改的是,您只需設置環境變量即可將中間件配置為使用X-Forwarded-For和X-Forwarded-Proto標頭。
七、總結
在本文中,我僅用兩個文件深入研究了從ASP.NET Core 2.x到3.0的更改:.csproj項目文件和`Program.cs文件。 從表面上看,對這些文件的更改很小,因此從2.x移植到3.0並不難。 這種簡單性掩蓋了幕后的重大變化:共享框架發生了重大變化,並且ASP.NET Core已在通用主機之上重建。
我希望人們會遇到的最大問題是NuGet包之間的差異-一些應用程序將不得不刪除對ASP.NET Core包的引用,同時添加對其他包的顯式引用。 盡管不難解決,但對於不熟悉此更改的用戶可能會造成混淆,因此應該首先懷疑任何問題。
翻譯:Andrew Lock https://andrewlock.net/exploring-the-new-project-file-program-and-the-generic-host-in-asp-net-core-3/
作者:郭崢
出處:http://www.cnblogs.com/runningsmallguo/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。