探索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

相关文章
相关标签/搜索