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

    题意略. 思路:题目就是在询问你m次,第k小是哪个数.首先我们可以想到直接排序后,即可O(1)来查找询问.但是题目中n的范围给的是1e7, 无法承受nlogn的复杂度.从而想到另外一种求静态第k小的方 ...

  2. 【CocosBuilder】学习笔记目录

    从2019年8月底开始学习CocosBuilder. ‎CocosBuilder 学习笔记(1) CCBReader 解析.ccbi文件流程 ‎CocosBuilder 学习笔记(2) .ccbi 文 ...

  3. awrcrt更新到2.17 ,添加了top SQL list

    应广大Oracle专家,教授的要求(被问了很多次,什么时候添加top sql 啊~~,最近一年由于很少交付巡检类的服务,所以没有机会更新)>终于为awrcrt更新了Top SQL list,版本 ...

  4. 【linux】【root权限的掌控】

    前言: 喜欢玩linux的都知道root权限是一个很重要的东西.因为linux里面万物皆文件,对于权限的掌控也就达到了一个前所未有的限制(不然随便一个用户rm -rf /*不就全完了,,哈哈). 下面 ...

  5. BZOJ 1036: [ZJOI2008]树的统计Count(树链剖分+单点更新+区间求和+区间求最大值)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 题意:略. 题解:树链剖分模版,注意一些细节即可. #include <ios ...

  6. Three.js 开发机房(四)

    这一节我们讲讲怎么画机柜,其实机柜如果作的复杂一点.逼真一点可以用3D建模工具,不过一般的项目中也不用做的那么麻烦,那我们就可以将机柜抽象以下,首先它是一块具有长宽高的立方体铁块,然后我们从中间在掏掉 ...

  7. 移动端rem距离单位的使用

    在做移动端开发的时候大家肯定会遇到适配问题,手机的屏幕大小有非常多的类别,使用传统的px距离单位已经无法满足我们的需要,于是rem便横空出世,他与百分比定位是比较像的,但是也是有一定的区别,在这里就跟 ...

  8. JS-特效 ~ 05. 缓动框架兼容封装/回掉函数/兼容透明度/层级、旋转轮播图、正则表达式、验证表单注册账号、

    缓动函数中opcity  写百分值的值 JS一般不用小数运算,会照成精度丢失 元素的默*认透明度是 层级一次性赋值,不缓动 利用for…in为同一个父元素的子元素绑定属性 缓动框架兼容封装/回掉函数/ ...

  9. WordCount2.2

    说明: 合作者:201631062507  201631062526(学号) 代码地址:https://gitee.com/WordCountMC/WordCountTeam 本次作业链接:https ...

  10. nvm 管理多个活动的node.js版本

    前序:最近在使用taro框架开发小程序,因为安装taro时遇到一些问题,后来重新安装了node版本——v10.16.3,却影响了我本地开发的项目,故此使用nvm来管理node的版本,更加灵活的切换以支 ...