前言:在这篇文章中咱们来看看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