探索ASP.NET Core 3.0系列一:新的项目文件、Program.cs和generic host

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

部分截图 如下:

 

 

四、.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/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

posted @ 2019-10-02 20:51  菠萝吹雪—Code  阅读(1376)  评论(2编辑  收藏  举报