探索Asp net core3中的 項目文件、Program.cs和通用host(譯)

引言

原文地址css

在這篇博客中我將探索一些關於Asp.net core 3.0應用的基礎功能——.csproj 項目文件和Program源文件。我將會描述他們從asp.net core 2.X在默認模版中是怎樣改變的,以及探討Aspnetcore3.0使用的Api的變化。html


介紹

.Net core 3.0 會在九月23號的 NET Conf上發佈,但如今已經有一個支持的預覽版本(Preview 8)。最新的預覽版本與最終發佈版本不可能有太多的變化,因此如今是開始嘗試和查看3.0增長的功能的好時機。git

Net core 3.0主要的更新是把windows桌面應用運行了Net core 上,可是Asp Net core 也增長了不少東西。也許最大的新特性就是服務端Blazor(我我的最感興趣的是客戶端的版本,可是如今還不可用),可是也有一些迭代的改變和新特性加入了Asp Net Core。github

在這篇博客中,我將探索一些關於很是 「基礎」 的更新。web

若是你打算把Asp net Core 2.X 軟件遷移到3.0 ,必定要查閱遷移指南json

在這篇博客中,當你建立一個新的Asp Net core應用時,好比 你用dotnet new webapi,我將探索.csproj 文件和Program.cs文件。在文章的最後,我將比較StartUp文件相對於2.X版本是怎樣變化的,以及Asp Net core 中使用中的模版有什麼不一樣(好比 web,webapi,mvc)windows


新項目文件與共享框架的變化

當你建立完一個新的Asp Net core項目,而後打開.csproj文件,它基本上是以下的樣子:api

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

</Project>

若是你與Asp net core 2.X的項目文件作比較,主要有以下的相同點和不一樣點mvc

  • <TargetFramework> 再也不是netcoreapp2.1或者2.2 ,而是netcoreapp3.0了,這是由於咱們把目標框架2.1/2.2 替換成了3.0
  • <Project> 元素仍然是 Microsoft.Net.Sdk.Web,雖然已經更新成了ASP.NET Core 3.0,可是你的項目文件中的語法仍然是沒有變化
  • Microsoft.AspNetCore.App meta 包已經不存在。

這裏的最後一個有意思的變動。在我以前的博客中提到,在Asp Net core2.X你引用一個名叫Microsoft.AspNetCore.App的共享框架元數據包。這個共享框架提供了大量的好處,好比避免你在你的應用中手動安裝全部的獨立的程序包以及容許你使用 運行時的向前滾動更新的特性。app

在Asp Net core3.0中,微軟已經再也不以Nuget元數據包的形式發佈這個共享框架,也不存在3.0.0版本的Microsoft.AspNetCore.App。這個共享框架仍然和之前同樣經過Net core 安裝,可是在3.0中你的使用略有不一樣。

在Asp Net core2.X 中,爲了引用這個共享框架,你會添加以下代碼到你的項目文件中:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

相反,在3.0中你要使用 <FrameworkReference> 元素

<ItemGroup>
  <FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

「可是停一下」,你說:「爲何個人Asp Net Core 項目文件沒有這個?」 這是個好問題,答案是 Microsoft.Net.Sdk.Web 默認包含了。


再也不有用於共享框架組件的包

在3.0中另一個最大的變動是你再也不須要獨立安裝共享框架的其餘部分的Nuget程序包了。例如,在Asp Net Core 2.X中,你能夠用 像 Microsoft.AspNetCore.Authentication或Microsoft.AspNetCore.Authentication這樣的獨立的程序包來替換依賴於整個框架的程序包:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.1.0"/>
  <PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.1.0"/>
</ItemGroup>

這一般對庫最有用,由於應用程序老是須要依賴於共享框架。然而,在 Net Core3.0中,這一切都不可能了。這些Nuget包不會在發佈了。相反,若是你須要在你的項目中引用其中的類庫,你必須添加這個 <FrameworkReference> 元素到你的項目中

例如EF Core和social authentication providers 這些程序包中另一個須要注意的事情是它們也再也不是共享框架的一部分了,若是你須要使用這些程序包,你必須手動從nuget上安裝到你的項目中。

對於這些程序包的完整清單,查閱這個Github issue


Program.cs 文件從 2.X到 3.0的變化

Asp Net Core 3.0中的Proram.cs文件第一眼看上去與2.X版本的很是類似。可是已經有許多類型發生了改變,這是由於在Net Core 3.0中,Asp Net Core爲了運行在通用host上已經進行了從新構建,使用獨立的Web Host已經被替代。

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

通用Host是從2.1版本被髮布的,這是個很是好的想法,可是我發現關於它的各類問題,主要問題是它爲類庫產生了太多的工做,值得慶幸的是,3.0中的這一變化應該能夠解決這些問題。

很大程度上,這個變化產生的最終結果是和你過去使用的Net Core2.X版本基本類似,可是用於配置你的app的所有配置的方法WebHost.CreateDefaultBuilder() 被替換成了兩個邏輯步驟,這個兩個獨立的方法叫作:

  • Host.CreateDefaultBuilder() ,負責配置你的app配置、日誌以及依賴注入容器

  • IHostBuilder.ConfigureWebHostDefaults() ,負責爲經典的Asp Net Core 應用添加所須要的全部東西,好比:配置Kestrel和使用一個 Startup.cs用於配置你的DI容器和中間件管道


通用Host builder

正如我以前說的那樣,通用Host爲Asp Net core 3.0的構建提供了基礎。它一樣也提供了你先前在Asp Net core應用中使用的基礎性的Microsoft.Extensions.* 元素,好比:日誌、配置和依賴注入。

下面的代碼是一個簡化版本的 Host.CreateDefaultBuilder() 方法。它和2.X版本的 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版本的不一樣點以下:

  • Hosting配置使用以 DOTNET_ 爲前綴的環境變量
  • Hosting配置使用命令行變量
  • 增長了 EventSourceLoggerEventLogLogger 日誌提供者
  • 能夠選擇使用ServiceProvider驗證功能
  • 沒有關於Web Hosting 的特定配置

第一個有意思的地方就是Host配置是如何設置的。對於Web Host而言,默認使用以 ASPNETCORE_ 爲前綴的環境變量做爲配置。因此設置ASPNETCORE_ENVIRONMENT 環境變量將會設置 Environment 配置的值。對於 通用Host來講,這個前綴如今是DOTNET_ ,和傳給應用運行時的任意命令行參數。

這個host配置起的做用比如是決定你的應用運行在什麼的主機環境,host配置與你應用配置(與IOptions接口一塊兒使用的配置)是隔離開來的。

配置你的app設置的方法 ConfigureAppConfiguration() 與2.X相比是沒有變化的,因此它仍然使用appsettings.json文件、appsetting.ENV.json風格文件、用戶機密數據、環境變量以及命令行參數。

通用Host的日誌部分已經在3.0進行了擴展。它仍舊經過你的app配置來配置日誌等級過濾器,以及添加控制檯和Debug日誌提供者。然而它一樣也添加來事件源日誌提供者,事件源日誌用於和像windows上的ETW、Linux上的LTTng這樣的系統日誌進行交互。另外,添加一個Event Log provider,只能在windows纔會把日誌信息寫入Windows Event Log。

最後,當你的app運行在開發環境時,通用Host配置依賴注入容器的目的是它會驗證範圍(Scopes),這個操做和2.X同樣。這旨在抓取捕獲的依賴關係的實例,在這些實例中,你將一個範圍(Scopes)的服務注入到單例服務中。在3.0中,通用Host通用能啓動 ValidateOnBuild 的功能,我將會在下一篇博客中講到。

通用Host一個關鍵的點是他是通用的,它和Asp Net core 或者Http 工做負載沒有任何關聯。你能夠像經典的Asp Net core 應用同樣把通用Host做爲你的控制檯app或者其餘長運行服務的基石。在3.0中你只須要在你的Asp net core 層的頂部增長一個 ConfigureWebHostDefaults() 就能夠搞定。


用ConfigureWebHostDefaults恢復Asp Net core功能

這篇博客已經很長了,因此在這裏我不想深刻挖掘太多的細節,可是,對於添加Asp Net core 「層」到 通用Host上面而言,ConfigureWebHostDefaults擴展方法是很是有用的。就簡單層面而言,調用這個方法會使Kestrel web 服務添加到這個host上面,可是這裏面也存在了大量的其餘的改變。下面是關於這個方法提供內容概覽,(包含了GenericWebHostBuilder提供的特性)

  • 爲Host 配置添加了 ASPNETCORE_ 前綴的環境變量(除了 DOTNET_ 前綴的變量和命令行參數)
  • 增長GenericWebHostService ,這是一個IHostedService的實現,它一般運行在Asp Net core服務上,這是一個主要的特性,這個特性爲Asp Net core 複用通用Host提供了可能。
  • 增長了一個額外的app配置源,在RazorUI類庫中,這個 StaticWebAssetsLoader 與靜態文件(css/js)共同發揮做用。
  • 使用默認Kestrel配置(與2.X同樣)
  • 增長 HostFilteringStartupFilter (和2.0同樣)
  • 增長 ForwardedHeadersStartupFilter ,若是 ForwardedHeaders_Enabled 配置值是true,例如,若是ASPNETCORE_FORWARDEDHEADERS_ENABLED 環境變量的值是true。
  • 啓動windows上的IIS集成
  • 增長一個端點路由到DI容器中

大部分東西是和Asp net core2.x相同的,不一樣的地方是:app做爲一個IHostService運行的基礎設施、端點路由和ForwardedHeadersStartupFilter ,其中端點路由在3.0是全局啓用的(再也不像2.X侷限於MVC/Razor頁面了)

ForwardedHeadersStartupFilter 在1.0已經出現了,當你的app運行在代理後面會用到它,是爲了確保你的應用能處理SSL-負載和生成正確的URL。這麼設計的目的是你能僅僅經過設置一個環境變量去配置一個使用 X-Forwarded-ForX-Forwarded-Proto 請求頭的中間件。


總結

在這篇博客中我深挖了從Asp Net Core2.X到3.0中的僅僅兩個文件——.csproj文件和Program.cs文件的變化。從表面上看,者僅僅是一些細微的變化,全部從2.X移植到3.0應該不會太難。這是天真地掩蓋了其中的巨大的變化——共享框架的明顯的變化,以及Asp Net core 已經在通用Host上重建了。

我認爲你們遇到的最大的問題是Nuget 程序包的差別——一些app將要必須移除Asp Net Core 程序包的引用,同時要明確地引用其餘的程序包。儘管解決這個問題是不太難,可是它會對不熟悉這個變化的用戶帶來困惑,因此應該第一時間審查這些變化

原文出處:https://www.cnblogs.com/blue-tian/p/11456489.html

相關文章
相關標籤/搜索