前言:在这篇文章中我们来看看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)
(2)
(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 中,为了引用共享框架,您将向项目文件添加以下内容:
"Microsoft.AspNetCore.App" />
相反,在3.0中,你可以用
"Microsoft.AspNetCore.App" />
细心的同学可能会说,为什么我新创建的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 软件包不再提供,相反,如果需要引用这些库中的任何一个,则必须从类库中向项目文件添加
有关应用包的完整列表,请参阅 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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。