前言:在這篇文章中咱們來看看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
咱們知道.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 等)。
咱們新建一個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
部分截圖 以下:
咱們瞥一眼感受 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容器和中間件管道。
正如我已經提到的,通用主機構成了構建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相比較有一下不一樣:
(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"層"。在最簡單的級別上,這涉及到將 Kestrel Web 服務器添加到主機,但還有其餘一些更改。如下是該方法提供的概述(包括GenericWebHostBuilder提供的功能):
(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/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
原文出處:https://www.cnblogs.com/runningsmallguo/p/11616202.html