探索ASP.NET Core 3.0系列一:新的項目文件、Program.cs和generic host

前言:在這篇文章中咱們來看看ASP.Net Core 3.0應用程序中一些基本的部分—— .csproj項目文件和Program.cs文件。我將會介紹它們從 ASP.NET Core 2.x 中的默認模板的一些變化,並討論一些API 的更改。css

 翻譯:Andrew Lock    https://andrewlock.net/exploring-the-new-project-file-program-and-the-generic-host-in-asp-net-core-3/html

 

探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.csgit

探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validationgithub

探索ASP.Net Core 3.0系列四:在ASP.NET Core 3.0的應用中啓動時運行異步任務web

探索 ASP.Net Core 3.0系列五:引入IHostLifetime並弄清Generic Host啓動交互json

探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性啓動信息中的結構化日誌windows

1、介紹

咱們知道.Net Core 3.0在9月23日正式發佈,你們已經開始在生產環境中開始使用了,下面讓咱們看一些基礎結構上的變化:api

(1)Microsoft.AspNetCore.App NuGet上已經不在提供。服務器

(2)ASP.Net Core 如今是基於generic host,而不是Web Host。mvc

若是你的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  等)。

2、新的.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、再也不爲共享框架組件提供包

在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

部分截圖 以下:

 

 

4、.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容器和中間件管道。

 

5、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().

 

6、使用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標頭。

 

7、總結

在本文中,我僅用兩個文件深刻研究了從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/

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

原文出處:https://www.cnblogs.com/runningsmallguo/p/11616202.html

相關文章
相關標籤/搜索