首页 > Web开发 > 详细

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

时间:2019-11-04 00:02:19      阅读:101      评论:0      收藏:0      [点我收藏+]
原文:探索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/

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

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

原文:https://www.cnblogs.com/lonelyxmas/p/11789406.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!