前言:在这篇文章中我们来看看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的更多相关文章

  1. 探索 ASP.Net Core 3.0系列五:引入IHostLifetime并弄清Generic Host启动交互

    前言:在本文中,我将介绍如何在通用主机之上重新构建ASP.NET Core 3.0,以及由此带来的一些好处. 同时也展示了3.0中引入新的抽象类IHostLifetime,并描述了它在管理应用程序(尤 ...

  2. 探索ASP.Net Core 3.0系列四:在ASP.NET Core 3.0的应用中启动时运行异步任务

    前言:在本文中,我将介绍ASP.NET Core 3.0 WebHost的微小更改如何使使用IHostedService在应用程序启动时更轻松地运行异步任务. 翻译 :Andrew Lock   ht ...

  3. 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

    前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...

  4. 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志

    前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...

  5. 探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs

    原文:探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs 前言:.NET Core 3.0 SDK包含比以前版本更多的现成模板. 在本文中,我将 ...

  6. [转]探索ASP.NET Core 3.0 系列

    这是该系列的第一篇文章:探索ASP.NET Core 3.0. 第1部分-探索新的项目文件Program.cs和通用主机(本文) 第2部分-比较ASP.NET Core 3.0模板之间的Startup ...

  7. [译]ASP.NET Core 2.0 系列文章目录

    基础篇 [译]ASP.NET Core 2.0 中间件 [译]ASP.NET Core 2.0 带初始参数的中间件 [译]ASP.NET Core 2.0 依赖注入 [译]ASP.NET Core 2 ...

  8. ASP.NET Core 2.0 : 系列目录

    目录: ASP.NET Core 2.0 : 一. 概述 ASP.NET Core 2.0: 二. 开发环境 ASP.NET Core 2.0 : 三. 项目结构 ASP.NET Core 2.0 : ...

  9. .Net Core 2.0生态(3):ASP.NET Core 2.0 特性介绍和使用指南

    ASP.NET Core 2.0 发布日期:2017年8月14日 ASP.NET团队宣布ASP.NET Core 2.0正式发布,发布Visual Studio 2017 15.3支持ASP.NET ...

随机推荐

  1. Spring框架的重要问题

    这篇文章总结了一些关于Spring框架的重要问题,这些问题都是你在面试或笔试过程中可能会被问到的. 目录 Spring概述 依赖注入 Spring Beans Spring注解 Spring的对象访问 ...

  2. 你知道JavaScript这六种错误类型吗?

    前言 今日话题,了解JavaScript的错误处理机制. 一.ReferenceError 引用一个不存在的变量时发生的错误.将一个值分配给无法分配的对象,比如对函数的运行结果或者函数赋值. 举栗子 ...

  3. CodeForces 474F Ant colony ST+二分

    Ant colony 题解: 因为一个数是合法数,那么询问区间内的其他数都要是这个数的倍数,也就是这个区间内的gcd刚好是这个数. 对于这个区间的gcd来说,不能通过前后缀来算. 所以通过ST表来询问 ...

  4. Increasing heap size while building the android source code on Ubuntu 15.10

    http://stackoverflow.com/questions/34940793/increasing-heap-size-while-building-the-android-source-c ...

  5. Educational Codeforces Round 69 (Rated for Div. 2)

                                                                                                  A. DIY ...

  6. 使用kubeadm方式安装K8S

    Kubeadm安装 kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实 ...

  7. Monte-Carlo Dropout

    Monte-Carlo Dropout Monte-Carlo Dropout(蒙特卡罗 dropout),简称 MC dropout. 一种从贝叶斯理论出发的 Dropout 理解方式,将 Drop ...

  8. jvm默认垃圾收集器(JDK789)

    jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代) jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel ...

  9. CXF添加拦截器和自定义拦截器

    前面讲了如何采用CXF开发webservice,现在来讲如何添加拦截器和自定义拦截器. 服务端代码: HelloWorld implementor=new HelloWorldImpl(); Stri ...

  10. Sublime Text 实用方法

    代码比对 安装Sublimerge插件 打开Sublime Text后,接着按Ctrl+Shift+P,并输入Install Package 待其加载完成,再输入Sublimerge Pro 当安装完 ...