第1部分 ASP.NET Core 入门

如今,从社交媒体 Web 应用程序、新闻网站到手机应用程序,电子商务应用程序无处不在。在幕后,几乎总是有一台服务器在运行Web应用程序或 HTTP API。Web 应用程序具有无限的可扩展性、部署到云上以及高性能。在最好的情况下,开始可能会让人不知所措,带着如此高的期望去尝试可能更是一个挑战。

对读者来说,好消息是 ASP.NET Core 是为了满足这些要求而设计的。无论您需要一个简单的网站、一个复杂的电子商务 Web 应用程序,还是一个分布式的微服务网络,您都可以使用 ASP.NET Core 的知识来构建符合您需求的Web应用程序。ASP.NET Core允许您在 Windows、Linux 或 macOS 上构建和运行 Web 应用程序。它是高度模块化的,因此您只使用所需的组件,尽可能保持应用程序的紧凑和性能。

在第1部分中,您将从一开始就开始构建第一个 Web 应用程序和 API。第1章给出了 ASP.NET Core的简单概述,如果您是一般 Web 开发新手,您会发现它特别有用。在第2章中,您将第一次看到完整的 ASP.NET Core 应用程序,我们将依次查看应用程序的每个组件,并了解它们如何协同工作以生成响应。

第3章详细介绍了中间件管道,它定义了如何处理传入的 Web 请求以及如何生成响应。我们将研究几个标准的中间件,看看 Razor Pages 框架是如何与管道相适应的。在第4章至第8章中,我们将重点介绍 Razor Pages,这是在 ASP.NET Core 应用程序中生成响应的主要方法。在第4章到第6章中,我们将检查 Razor Pages 框架本身的行为、路由和模型绑定。在第7章和第8章中,我们将介绍如何使用 Razor 语法和 Tag Helpers 为应用程序构建 UI,以便用户可以导航并与应用程序交互。最后,在第9章中,我们将探讨 ASP.NET Core 的特定特性,这些特性允许您构建 Web API,并了解这与构建基于 UI 的应用程序有何不同。

第1部分中有很多内容,但到最后,您将很好地使用 ASP,NET Core 构建简单的应用程序。不可避免地,我将对框架的一些更复杂的配置方面进行粉饰,但您应该对 Razor Pages 框架以及如何使用它来构建动态 Web 应用程序有一个很好的理解。在本书的后面部分,我们将深入探讨 ASP.NET Core 框架,在那里您将学习如何配置应用程序并添加额外的功能,例如用户配置文件。

第1章 ASP.NET Core 入门

本章包括

  • 什么是 ASP.NET Core?
  • 您可以使用 ASP.NET Core构建的内容
  • .NET Core 和 .NET 5.0 的优势和局限性
  • ASP.NET Core 的工作原理

选择用一个新的框架学习和开发是一项巨大的投资,因此尽早确定它是否适合你很重要。本章提供了一些有关 ASP.NET Core 的背景知识,如:它是什么,它是如何工作的,以及为什么您应该考虑它来构建 Web 应用程序。

如果您是 .NET 开发的新手,本章将帮助您了解 .NET 环境。对于现有的 .NET 开发人员,本章将提供指导并说明现在是否是考虑将重点转移到 .NET Core 和 .NET 5.0 的适当时机,以及 ASP.NET Core 与以前版本的 ASP.NET 相比可以提供的优势。

在本章结束时,您应该对 .NET 环境、.NET 5.0 的作用以及 ASP.NET Core 工作的基本机制有了一个很好的概述,因此,不用多说,让我们深入了解吧!

1.1 ASP.NET Core 简介

ASP.NET Core 是一个跨平台、开源的 Web 应用程序框架,您可以使用它快速构建动态的、服务器端呈现的应用程序。您也可以使用 ASP.NET Core 创建可供移动应用程序、基于浏览器的单页应用程序(如Angular和React)或其他后端应用程序使用的 HTTP API。

ASP.NET Core 为构建应用程序提供了结构、帮助函数和框架,这使您不用自己编写大量代码。ASP.NET Core 框架代码首先处理客户端请求,然后调用应用程序业务逻辑中的方法,如图 1.1 所示,该业务逻辑是应用程序的核心。您可以在这里与其他服务交互,例如数据库或远程 API,但您的业务逻辑通常不直接依赖于 ASP.NET Core。

图1.1 典型的 ASP.NET 核心应用程序由几个层组成。ASP.NET Core 框架代码处理来自客户端的请求,解释复杂的网络代码。然后,框架调用您使用框架提供的原语编写的处理程序(Razor Pages 和 WebAPI 控制器)。最后,这些处理程序调用应用程序的业务逻辑,这些业务逻辑通常是 C# 类和对象,没有任何特定于 ASP.NET Core 的依赖关系。

在本小节中,我们主要介绍

  • 使用 Web 框架的原因
  • 以前的 ASP.NET 框架的优点和局限性
  • 什么 ASP.NET Core 及其推动力

在本节结束时,您应该对 ASP.NET Core 的创建原因、其设计目标以及您可能想要使用它的原因有一个很好的理解。

 1.1.1 使用 Web 框架

如果你是网络开发的新手,那么进入一个有很多流行语和大量不断变化的产品的领域可能会让人望而却步。您可能会想,如果它们都是必需的,那么从服务器返回文件真的有那么困难吗?

嗯,在不使用 Web 框架的情况下构建静态 Web 应用程序是完全可能的,但其功能将受到限制。一旦你想提供任何安全性或灵活性,你就很可能会遇到束手无策,这时,最初吸引你的简单感将在你眼前变得非常渺小。

正如桌面或移动开发框架可以帮助您构建本地应用程序一样,ASP.NET Core 使编写 Web 应用程序相比从头开始构建,显得一切都会更快、更容易、更安全。它包含一些常见的库,如:

  • 创建动态变化的网页
  • 允许用户登录您的 Web 应用
  • 允许用户使用其 Facebook 帐户使用 OAuth 登录到您的 Web 应用
  • 为构建可维护的应用程序提供通用结构
  • 读取配置文件
  • 提供图像文件
  • 记录对Web应用的请求

任何现代 Web 应用程序的关键都是生成动态网页的能力。动态网页可以根据当前登录的用户显示不同的数据,也可以显示用户提交的不同内容。如果没有动态框架,就不可能登录网站或在页面上显示任何类型的个性化数据。简而言之,像亚马逊、eBay 和 Stack Overflow(见图1.2)这样的网站是不可能实现的。

  图1.2 Stack Overflow 网站(https://stackoverflow.com)通过使用 ASP.NET Core,几乎完全是动态内容。

ASP.NET 的优点和局限性

ASP.NET Core 是 Microsoft 于2016年6月发布的 ASP.NET Web 框架的更新。ASP.NET 的早期版本已经进行了许多增量更新,重点是提高开发人员的生产效率并优先考虑向后兼容性。ASP.NET Core 通过进行重大的架构更改,重新思考 Web 框架的设计和构建方式,打破了这一趋势。

ASP.NET Core 在很大程度上归功于其 ASP.NET 的传承,虽然许多功能从以前版本继承而来,但是 ASP.NET Core 是一个新的框架。整个技术栈已经被完全重写,其中包括 Web 框架和底层平台。

变化的核心是 ASP.NET 一直以来保持的能够在与其他现代框架进行比较时保持领先的思想,但不管如何,现有的 .NET 开发人员还是可以对其继续保持足够的熟悉程度。

要了解微软为什么决定构建一个新的框架,必须了解以前的 ASP.NET Web 框架的优点和局限性。

ASP.NET 的第一个版本于2002年作为 .NETFramework1.0 的一部分发布,以响应当时传统的ASP和PHP脚本环境。ASP.NET WebForm 允许开发人员使用图形设计器和参考桌面应用程序构建技术的简单事件模型来快速创建 Web 应用程序。

ASP.NET Framework 允许开发人员快速创建新的应用程序,但随着时间的推移,Web 开发生态发生了巨大的变化。ASP.NET WebForm 在构建更大的应用程序时遇到了许多问题。特别是其缺乏可测试性、复杂的状态模型以及生成 HTML 的能力不足(使客户端开发变得困难)导致开发人员不得不重新评估使用其他选项的框架与工具的必要性。

作为回应,微软于2009年发布了 ASP.NET MVC 的第一个版本,该版本基于模型-视图-控制器模式,这是其他框架(如Ruby on Rails、Django和Java Spring)中使用的常见 Web 设计模式。该框架允许您将 UI 元素与应用程序逻辑分离,使测试更容易,并对 HTML 生成过程提供了严格的控制。

ASP.NET MVC 自第一次发布以来又经历了四次迭代,但它们都是基于 System.Web.dll 文件提供的相同底层框架构建的。此库是 .NET Framework 的一部分,因此它与所有版本的 Windows 一起预装,并包含 ASP.NET 在构建Web应用程序时使用的所有核心代码。

这种依赖既有优点也有缺点。一方面,ASP.NET 框架是一个可靠的、经过实战测试的平台,适合在 Windows 上构建 Web 应用程序。它提供了广泛的功能,这些功能已经在生产环境中使用多年,几乎所有 Windows Web 开发人员都知道它。

另一方面,这种依赖限制了对底层 System.Web.dll 文件的更改。这些更改影响深远,因此推出速度缓慢。这限制了 ASP.NET 自由发展的程度,导致发布周期仅每隔几年发生一次。另外,与 Windows Web 主机 Internet 信息服务(IIS)的显式耦合,这也阻止了它在非 Windows 平台上的使用。

最近,微软宣布 .NET Framework 已“完成”。它不会被删除或替换,但也不会发布任何新功能。因此,基于 System.Web.dll 的 ASP.NET 也不会发布新功能或更新。

近年来,许多 Web 开发人员开始研究可以在 Windows 以及 Linux 和 macOS 上运行的跨平台 Web 框架。微软觉得是时候创建一个不再与 Windows 捆绑在一起的框架了,于是 ASP.NET Core 诞生了。

1.1.2 什么是 ASP.NET Core?

使用 ASP.NET Core 创建 Web 框架的动机具有以下四个主要特点:

  • 跨平台运行和开发
  • 采用模块化架构,便于维护
  • 完全作为开源软件开发
  • 适用于 Web 开发的当前趋势,例如客户端应用程序和部署到云环境

为了实现所有这些目标,微软需要一个可以为创建基本对象(如列表和字典)以及执行简单的文件操作提供底层库的平台。到目前为止,ASP.NET 开发一直专注并依赖于只适用于 Windows 的 .NET Framework。对于 ASP.NET Core,Microsoft 创建了一个在 Windows、Linux 和 macOS 上运行的轻量级平台,称为 .NET Core(以及.NET 5.0),如图1.3所示。

 图1.3  ASP.NET Core、ASP.NET、.NET Core/.NET 5.0 和 .NET Framework 之间的关系。ASP.NET Core 在 .NET Core 和 .NET 5.0 上运行,因此它可以跨平台运行。相反,ASP.NET 仅在 .NET Framework 上运行,因此它与 Windows 操作系统绑定。

定义:NET 5.0是继3.1之后的下一个.NET Core版本。它将.NET Core和其他.NET平台统一为一个运行时和框架。术语.NET Core和.NET 5.0通常可以互换使用,但为了与Microsoft的语言保持一致,本文使用术语.NET 5.0来指最新版本的.NET Core,而在指以前的版本时使用术语.NET Core。

.NET Core(及其后续版本.NET 5.0)采用了许多与 .NET Framework 相同的 API,但它更具模块化,只实现了 .NET Framework 的一部分功能,目的是提供更简单的实现和编程模型。尽管它在许多 API 中使用了类似的代码,但它是一个完全独立的平台,而不是 .NET Framework 的分支。

仅使用 .NET5.0,就可以构建跨平台运行的控制台应用程序。Microsof t创建 ASP.NET Core 作为控制台应用程序之上的附加层,因此转换为 Web 应用程序需要添加和组合库,如图1.4所示。

  图1.4  ASP.NET Core 应用程序模型。.NET5.0 平台为运行命令行应用程序提供了基本控制台应用程序模型。添加 Web 服务器库可将其转换为 ASP.NET Core web 应用程序。通过其他库添加了其他功能,如配置和日志记录。

通过将 ASP.NET Core web 服务器添加到 .NET 5. 0的应用程序可以作为 Web 应用程序运行。ASP.NET Core 由许多小型库组成,您可以从中选择,为应用程序提供不同的功能。实际上没有应用程序需要所有可用的库,只需要添加所需的库。有些库是常见的,几乎会出现在您创建的每个应用程序中,例如用于读取配置文件或执行日志记录的库。其他库基于这些基本功能构建,提供特定于应用程序的功能,例如通过 Facebook 或 Google 进行第三方登录。

大多数 ASP.NET Core 使用的库都可以在 GitHub 上找到,并被 Microsoft ASP.NET Core 组织中存储在 https://github.com/dotnet/aspnetcore。您可以在那里找到核心库,如身份验证库和日志库,以及更多的外围库,如第三方身份验证库。

所有 ASP.NET Core 应用程序都将遵循类似的基本配置设计,正如公共库所建议的那样,但总体而言,框架是灵活的,允许您自由创建自己的代码约定。ASP.NET Core 这个有点模糊的术语涵盖了这些公共库、基于它们的扩展库以及它们所提倡的设计约定。

 1.2 何时选择 ASP.NET Core

 希望您现在已经大致了解了 ASP.NET Core 是什么以及它是如何设计的。但问题仍然存在:你应该使用它吗?微软建议所有新的 .NET Web 开发都应该使用 ASP.NET Core,但对于任何开发人员或公司来说,切换或学习新的 Web stack 都是一个很大的挑战。在本节中,将介绍

  • 您可以使用 ASP.NET Core 构建什么类型的应用程序
  • ASP.NET Core 的一些亮点
  • 为什么您应该考虑将 ASP.NET Core 用于新应用程序
  • 将现有 ASP.NET 应用程序转换为 ASP.NET Core 之前需要考虑的事项

1.2.1 您可以构建什么类型的应用程序?

ASP.NET Core 提供了一个通用的 Web 框架,可用于各种应用程序。很明显,它可以用于构建丰富、动态的网站,无论是电子商务网站、基于内容的网站还是大型N层应用程序,这与 ASP.NET 的前一版本非常相似。

当 .NETCore 最初发布时,很少有第三方库可用于构建这些类型的复杂应用程序。经过几年的积极发展,情况已不再如此。许多开发人员已经更新了他们的库以使用 ASP.NET Core,并且创建了许多其他库以专门针对 ASP.NET Core。例如,开源内容管理系统(CMS)Orchard 已被重新开发为Orchard Core,以在ASP.NET Core上运行。相比之下,cloudscribe CMS项目(图1.5)从一开始就专门为 ASP.NET Core 编写。

注:Orchard 项目源代码位于 https://github.com/OrchardCMS。orchardcore(www.orchardcore.net)源代码位于 https://github.com/OrchardCMS/OrchardCore。cloudscribe 项目(www.cloudscribe.com)源代码位于 https://github.com/cloudscribe.

  图1.5 .NET Foundation 网站(https://dotnetfoundation.org/)使用 cloudscribe CMS 和 ASP.NET Core 构建。

开发传统服务器端呈现的基于页面的 Web 应用程序是 ASP.NET 开发的必备技能和发展方向,无论是早期版本的 ASP.NET 还是 ASP.NET Core。此外,使用客户端框架(通常与 REST 服务器对话)的单页应用程序(SPA)很容易使用 ASP.NET Core 创建。无论您使用的是 Angular、Vue、React 还是其他客户端框架,都很容易创建 ASP.NET Core 应用程序来充当服务器端 API。

定义:REST 代表 representational state transfer。RESTful 应用程序通常使用轻量级和无状态 HTTP 调用来读取、发布(创建/更新)和删除数据。

 ASP.NET Core 不限于创建 RESTful 服务。根据您的需求,很容易为应用程序创建 Web 服务或远程过程调用(RPC)风格的服务,如图 1.6 所示。在最简单的情况下,您的应用程序可能只公开一个端点,从而缩小其范围,成为一个微服务。ASP.NET Core 非常适合构建简单的服务,这得益于它的跨平台支持和轻量级设计。 

 图1.6  ASP.NET Core 可以充当各种客户端的服务器端应用程序:它可以为传统 Web 应用程序提供 HTML 页面,它可以充当客户端 SPA 应用程序的 REST API,也可以充当客户端应用程序的临时 RPC 服务。

注意:在本文中,我们重点关注构建传统的、基于页面的服务器端呈现的 Web 应用程序和 RESTful web API。当然,在第22章中也展示了如何创建“Headless”工作服务

在选择平台时,您应该考虑多个因素,但不是所有因素都是技术性的。其中一个因素是您可以从其创建者那里获得支持的水平。对于一些组织来说,这可能是采用开源软件的主要障碍之一。幸运的是,微软已承诺从.NET Core和ASP.NET Core发布之日起至少三年内为长期支持(LTS)版本提供全面支持。由于所有的开发都是在公开的环境中进行的,有时您可以从普通社区以及直接从Microsoft那里获得问题的答案。

注:在以下位置查看支持策略 https://dotnet.microsoft.com/platform/support/policy/dotnet-core

在决定是否使用ASP.NET Core时,您需要考虑两个主要方面:您是否已经是.NET开发人员,以及您是在创建新应用程序还是在转换现有应用程序。

1.2.2 如果您是.NET开发新手

如果您是.NET开发新手,并且正在考虑ASP.NET Core,那么欢迎光临!微软正在将ASP.NET Core作为web开发初学者的有吸引力的选择,但采用.NET跨平台意味着它在自己的地盘上与许多其他框架竞争。与其他跨平台web框架相比,ASP.NET Core有许多卖点:

  • 这是一个现代、高性能、开源的web框架。
  • 它使用熟悉的设计模式和范例。
  • C#是一种很棒的语言(如果您愿意,也可以使用VB.NET或F#)。
  • 您可以在任何平台上构建和运行。

ASP.NET Core是对ASP.NET框架的重新构建,在新的.NETCore/.NET 5.0平台之上使用现代软件设计原则构建。尽管在某种意义上是新的,但.NETCore已经在生产中广泛使用了多年,并从已经使用了近二十年的成熟、稳定和可靠的.NET Framework中得到了很大的借鉴。您可以放心地认为,通过选择ASP.NET Core和.NET5.0,您将获得一个可靠的平台以及一个功能齐全的web框架。

今天可用的许多web框架都使用了类似的成熟设计模式,ASP.NET Core也不例外。例如,Rubyon Rails以其使用模型-视图-控制器(MVC)模式而闻名;Node.js以使用小型离散模块(称为管道)处理请求的方式而闻名;在各种各样的框架中都可以找到依赖关系。如果您熟悉这些技术,您应该会发现很容易将它们转移到ASP.NET Core;如果它们对您来说是新的,那么您可以期待您将要使用的是行业最佳的设计模式!

注意:您将在第3章中遇到管道,在第4章中遇到MVC,在第10章中遇到依赖注入。

C#是.NET开发的主要语言,特别是ASP.NET Core。这种语言有大量的追随者,这是有充分理由的!作为一种面向对象的基于C的语言,它为那些使用C、Java和许多其他语言的人提供了一种熟悉感。此外,它还有许多强大的功能,如语言集成查询(LINQ)、闭包和异步编程构造。C#语言也是在GitHub上公开设计的,微软的C#编译器也是如此,代码为Roslyn。C# 语言和 .NET 编译器平台 GitHub 源代码库位于 https://github.com/dotnet/roslyn

注意:本书中主要使用C#,并将重点介绍它提供的一些新功能,但我不会从头开始教这种语言。如果你想学习C#,我推荐Jon Skeet的第四版《C# in Depth》(Manning,2019)和Jort Rodenburg的《Code like a Pro in C#》(Manning,2021)。

ASP.NET Core和.NET5.0的主要卖点之一是能够在任何平台上开发和运行。无论您使用的是Mac、Windows还是Linux,都可以运行相同的ASP.NET Core应用程序,并在多个环境中进行开发。作为Linux用户,支持多种发行版(RHEL、Ubuntu、Debian、CentOS、Fedora和openSUSE等),因此您可以放心选择的操作系统将是一个可行的选择。ASP.NET Core甚至在小型Alpine分发版上运行,以实现对容器的真正紧凑部署。

 内置容器

 传统上,web应用程序直接部署到服务器或者虚拟机。虚拟机允许操作系统安装在虚拟硬件层中,从而抽象出底层硬件。与直接安装相比,这有几个优点,例如易于维护、部署和恢复。不幸的是,在文件大小和资源使用方面要求很高。

这也是引入容器的原因。容器要轻巧得多,而且没有虚拟机的开销。它们构建在一系列层中,在启动时不需要启动新的操作系统。这意味着它们启动快速,非常适合快速调配。容器,特别是Docker,正在迅速成为构建大型可扩展系统的首选平台。

对于ASP.NET应用程序来说,容器从来都不是一个特别有吸引力的选项,但随着ASP.NET Core、.NET 5.0和Docker for Windows的应用,这一切都在改变。在跨平台.NET5.0框架上运行的轻量级ASP.NET Core应用程序非常适合瘦容器部署。您可以在第16章中了解有关部署选项的更多信息。

除了在每个平台上运行之外,.NET的卖点之一是只需要编写和编译一次。您的应用程序被编译为中间语言(IL)代码,这是一种独立于平台的格式。如果目标系统安装了.NET 5.0运行时,则可以运行从任何平台编译的IL。这意味着,您可以在Mac或Windows机器上开发,并将完全相同的文件部署到生产Linux机器上。这一编译一次,随时随地运行的承诺最终通过ASP.NET Core和.NET Core/.NET 5.0实现。

1.2.3 如果您是正在创建新应用程序.NET Framework开发人员

如果您是一名.NET开发人员,那么选择是否使用ASP.NET Core开发新应用程序在很大程度上取决于时间。早期版本的.NET Core缺少一些功能,难以采用。随着.NET Core 3.1和.NET 5.0的发布,这不再是问题;Microsoft现在明确建议所有新的.NET应用程序都应使用.NET 5.0。Microsoft已承诺为旧的ASP.NET框架提供错误和安全修复,但不会提供更多功能更新。NET Framework未被删除,因此旧应用程序将继续工作,但不应将其用于新开发。

ASP.NET Core与以前的ASP.NET框架相比的主要优势是

  • 跨平台开发和部署
  • 将性能作为一项功能
  • 简化的托管模型
  • 定期发布,发布周期更短
  • 开源
  • 模块化功能

作为一名.NET开发人员,如果您没有使用任何特定于Windows的构造(如注册表),那么跨平台构建和部署的能力将打开一扇全新的应用程序之门:利用云中更便宜的Linux VM托管,使用Docker容器进行可重复的连续集成,或者在Mac上编写.NET代码,而无需运行Windows虚拟机。ASP.NET Core与.NET 5.0相结合,使这一切成为可能。

.NET Core和.NET 5.0本质上是跨平台的,但如果需要,您仍然可以使用特定于平台的功能。例如,可以使用兼容包启用特定于Windows的功能,如注册表或目录服务,使这些API在.NET 5.0中可用,因此,您需要注意此类应用程序仅在Windows环境中运行,而且时刻注意可能丢失的APIs。

注:Windows 兼容性包旨在帮助将代码从 .NET Framework 移植到 .NET Core/.NET 5.0。详情请参考 https://docs.microsoft.com/dotnet/core/porting/windows-compat-pack

以前的ASP.NET框架的托管模型是一个相对复杂的模型,依赖于Windows IIS来提供web服务器托管。在跨平台环境中,这种共生关系是不可能的,因此采用了一种替代的宿主模式,将web应用程序与底层宿主分离。这一机会导致了Kestrel的诞生:一个快速、跨平台的HTTP服务器,ASP.NET Core可以在其上运行。

ASP.NET Core应用程序是一种控制台应用程序,它可以自行托管web服务器并直接处理请求,而不是以前的设计,即IIS调用应用程序的特定点,如图1.7所示。这种托管模型在概念上要简单得多,允许您从命令行测试和调试应用程序,尽管它不一定消除在生产环境中运行IIS(或等效)的需要,正如您将在第1.3节中看到的那样。

 图1.7  ASP.NET(顶部)和ASP.NET Core(底部)中托管模型之间的差异。在ASP.NET的早期版本中,IIS与应用程序紧密耦合。ASP.NET Core中的托管模型更简单;IIS将请求交给ASP.NET Core应用程序中的自托管web服务器并接收响应,但对应用程序没有更深入的了解。

注:您还可以选择在IIS内部运行ASP.NET Core,如图1.7所示,这可以比反向代理版本具有性能优势。这主要是一个部署细节,不会改变您构建ASP.NET Core应用程序的方式。

将托管模型更改为使用内置HTTP web服务器,这又创造了一个机会。在过去,性能一直是ASP.NET应用程序的一个痛点。当然,构建高性能应用程序stack overflow是可能的(https://stackoverflow.com)证明了这一点,但web框架本身的设计并没有将性能作为优先事项,因此它可能会成为某种障碍。

为了在跨平台上具有竞争力,ASP.NET团队致力于使Kestrel HTTP服务器尽可能快。TechEmpower(www.technempower.com/benchmarks)多年来一直在各种语言的web框架上运行基准测试。在第19轮纯文本基准测试中,TechEmpower宣布ASP.NET Core和Kestrel是测试的400多个框架中最快的!

在 Web 开发中,技术始终处于不断变化的状态,因此这些基准将随着时间的推移而发展。虽然 ASP.NET Core 可能无法保持其前十名的位置,但您可以肯定,性能是 ASP.NET Core团队的关键焦点之一。

Web服务器的命名难题
网络编程的一个困难方面是一系列经常相互冲突的术语,令人困惑。例如,如果您过去使用过IIS,您可能会将其描述为web服务器,或者可能是web主机。相反,如果您曾经使用Node.js构建过应用程序,那么您可能也将该应用程序称为web服务器。或者,您可以调用应用程序运行web服务器的物理机器!
类似地,您可能已经为internet构建了一个应用程序,并将其称为网站或web应用程序,这可能是基于其显示的动态级别而任意决定的。
在本书中,当我在ASP.NET Core上下文中说“web服务器”时,我指的是作为ASP.NET Core应用程序的一部分运行的HTTP服务器。默认情况下,这是Kestrel web服务器,但这不是必需的。如果您愿意,可以编写一个替代web服务器并将其替换为Kestrel。
web服务器负责接收HTTP请求并生成响应。在ASP.NET的早期版本中,IIS扮演了这个角色,但在ASP.NET Core中,Kestrel是web服务器。
在本书中,我只使用“web应用程序”一词来描述ASP.NET Core应用程序,无论它们是仅包含静态内容还是完全动态的。无论哪种方式,它们都是通过网络访问的应用程序,因此这个名称似乎最合适。

Kestrel的许多性能改进并不是来自ASP.NET团队成员本身,而是来自GitHub开源项目的贡献者。在开放环境中开发意味着您通常会看到修复程序和功能比以前版本的ASP.NET更快地进入生产环境,因为ASP.NET依赖于.NET Framework和Windows,因此发布周期较长。

注:Kestrel HTTP 服务器 GitHub 项目可以在 ASP.NET Core 存储库中找到 https://github.com/dotnet/aspnetcore

相比之下,.NET 5.0,以及ASP.NET Core,被设计为以较小的增量发布。主要版本将以可预测的节奏发布(.NET 5.0 及更高版本的发布计划:https://devblogs.microsoft.com/dotnet/introducing-net-5/),每年发布一次新版本,每两年发布一次长期支持(LTS)新版本。此外,可以在需要时发布bug修复和小更新。附加功能以NuGet包的形式提供,独立于基础.NET 5.0平台。

注意:NuGet是一个.NET包管理器,它支持将库导入到项目中。它相当于Ruby Gems、npm for JavaScript 或 Maven for Java。

为了实现这种发布方法,ASP.NET Core是高度模块化的,与其他功能的耦合尽可能少。这种模块化为依赖关系提供了一种 pay-for-play 方法,即从一个简单的应用程序开始,只添加所需的附加库,而不是以前ASP.NET应用程序的 kitchen-sink 方法。甚至MVC也是一个可选的包!但别担心,这种方法并不意味着ASP.NET Core缺少功能;这意味着你需要有选择地加入他们。一些关键的基础改进包括

  • 用于定义应用程序行为的中间件“管道”
  • 对依赖注入的内置支持
  • 组合的UI(MVC)和API(Web API)基础架构
  • 高度可扩展的配置系统
  • 默认情况下,使用异步编程可扩展到云平台

这些功能中的每一个在ASP.NET的早期版本中都是可能的,但需要大量的额外工作来设置。有了ASP.NET Core,他们都准备就绪,等待连接!

微软完全支持ASP.NET Core,所以如果你想构建一个新系统,没有什么理由不使用它。您可能遇到的最大障碍是希望使用ASP.NET Core中不再支持的编程模型,例如Web表单或WCF服务器,我将在下一节中讨论。

希望本节已经激发了您使用ASP.NET Core构建新应用程序的兴趣。但是,如果您是一名现有的ASP.NET开发人员,正在考虑是否将现有的ASP.NET应用程序转换为ASP.NET Core,这完全是另一个问题。

1.2.4 将现有ASP.NET应用程序转换为ASP.NET Core

与新的应用程序相比,现有的应用程序可能已经提供了价值,因此在从ASP.NET转换为ASP.NET Core的过程中,执行可能相当于重大重写的操作应该总是有实际好处的。采用ASP.NET Core的优点与新应用程序的优点大致相同:跨平台部署、模块化功能和注重性能。福利是否充分将在很大程度上取决于您的应用程序的具体情况,但有一些特征是明确的转换指标:

  • 应用程序使用ASP.NET WebForm
  • 您的应用程序是使用WCF构建的
  • 您的应用程序很大,具有许多“高级”MVC功能

如果您有ASP.NET Web表单应用程序,则不建议尝试将其转换为ASP.NET Core。Web表单与System.Web.dll密不可分,因此在ASP.NET Core中可能永远不可用。将应用程序转换为ASP.NET Core将导致从零开始重写应用程序,不仅改变框架,而且改变设计范式。更好的方法是慢慢引入Web API概念,并尝试减少对传统Web表单结构(如ViewData)的依赖。您可以在网上找到许多资源来帮助您使用这种方法,特别是 https://dotnet.microsoft.com/zh-cn/apps/aspnet/apis 网站。

注:另一种方法是考虑使用社区驱动的努力将您的应用程序转换为Blazor,以创建常见WebForms组件的Blazor版本:https://github.com/FritzAndFriends/BlazorWebFormsComponents

ASP.NET Core仅部分支持Windows Communication Foundation(WCF)。使用一些WCF服务是可能的,但支持充其量是不稳定的。没有支持从ASP.NET Core应用程序托管WCF服务的方法,所以如果您绝对必须使用WCF,那么目前最好避免使用ASP.NET Core。

注:您可以在以下位置找到用于将 WCF 与 .NET Core 一起使用的客户端库 https://github.com/dotnet/wcf

提示:如果您喜欢WCFs RPC风格的编程,但对WCF本身没有硬性要求,请考虑改用gRPC。gRPC是一个现代RPC框架,具有许多类似于WCF的概念,并且由ASP.NET Core开箱即用支持。

注:您可以在以下位置找到Microsoft为WCF开发人员提供的gRPC电子书 https://learn.microsoft.com/en-us/dotnet/architecture/grpc-for-wcf-developers/

如果您现有的应用程序很复杂,并且大量使用了以前的MVC或Web API扩展点或消息处理程序,那么将您的应用程序移植到ASP.NET Core可能会更加困难。ASP.NET Core与ASP.NET MVC的早期版本具有许多相似的功能,但底层架构有所不同。之前的几个功能没有直接替换,因此需要重新思考。

应用程序越大,将应用程序转换为ASP.NET Core的难度就越大。微软自己认为,将应用程序从ASP.NET MVC移植到ASP.NET Core至少与将ASP.NET Web表单移植到ASP.NET MVC一样大。如果这不会吓到你,那么什么都不会吓到!

如果应用程序很少使用,不是您核心业务的一部分,或者在短期内不需要重大开发,我强烈建议您不要尝试将其转换为ASP.NET Core。在可预见的将来,Microsoft将支持.NET Framework(Windows本身依赖于它!),而转换这些“边缘”应用程序的回报不太值得。

那么,什么时候应该将应用程序移植到ASP.NET Core?正如我已经说过的,最好的开始机会是在小的应用领域,新的项目,而不是现有的应用程序。也就是说,如果所讨论的现有应用程序很小,或者将来需要大量开发,那么移植可能是一个不错的选择。在可能的情况下,最好在小的迭代中工作,而不是试图一次转换整个应用程序。但如果您的应用程序主要由MVC或WebAPI控制器和相关的Razor视图组成,那么迁移到ASP.NET Core可能是一个不错的选择。

1.3  ASP.NET Core如何工作?

到目前为止,您应该对ASP.NET Core是什么有一个基础的了解。在本节中,您将看到使用ASP.NET Core构建的应用程序是如何工作的,从用户请求URL到如何在浏览器中显示页面。首先,您将看到HTTP请求在web服务器如何处理,然后您将看到ASP.NET Core如何扩展该过程以创建动态网页。

1.3.1  HTTP web请求如何工作?

如您所知,ASP.NET Core是一个用于构建从服务器提供数据的web应用程序的框架。web开发人员最常见的场景之一是构建一个可以在web浏览器中查看的web应用程序。图1.8显示了所有web服务器的工作流程。

 图1.8 请求网页。用户首先通过网页发送请求,这将导致向服务器发送HTTP请求。服务器解释请求,生成必要的HTML,并以HTTP响应形式将其发送回。然后浏览器可以显示网页。

 当用户导航到网站或在浏览器中键入URL时,该过程开始。URL或web地址由主机名和web应用程序上某些资源的路径组成。在浏览器中导航到该地址将使用HTTP协议从用户的计算机向web应用所在的服务器发送请求。

定义:网站的主机名通过域名服务(DNS)映射到IP地址来唯一标识其在互联网上的位置。示例包括microsoft.com,www.google.co.uk和facebook.com。

该请求通过互联网,可能到达世界的另一端,直到它最终到达与给定主机名相关联的服务器,web应用程序在该服务器上运行。该请求可能会在途中的多个路由器上被接收和重新广播,但只有当它到达与主机名相关联的服务器时,请求才会被处理。

HTTP简介
超文本传输协议(HTTP)是支持web的应用程序级协议。它是一种无状态请求响应协议,客户端机器向服务器发送请求,服务器依次发送响应。
每个HTTP请求都包含一个表示请求“类型”的动词和一个表示要与之交互的资源的路径。当向服务器发送数据时,它们通常还包括标头(即键值对),在某些情况下还包括正文(例如表单的内容)。
HTTP响应包含状态代码,指示请求是否成功,以及可选的标头和正文。
有关HTTP协议本身以及更多示例的更详细信息,请参见Sau Sheong Chang(Manning,2016)的《Go Web Programming》中的第1.3节(“HTTP简介”),https://livebook.manning.com/book/go-web-programming/chapter-1/point-9018-55-145-1。

 一旦服务器接收到请求,它将检查请求是否合理,如果合理,它将生成HTTP响应。根据请求,该响应可以是网页、图像、JavaScript文件或简单的确认。在本例中,假设用户已经访问了web应用程序的主页,因此服务器会使用一些HTML进行响应。HTML被添加到HTTP响应中,然后通过互联网发送回发出请求的浏览器。

一旦用户的浏览器开始接收HTTP响应,它就可以开始在屏幕上显示内容,但HTML页面也可能引用服务器上的其他页面和链接。要显示完整的网页,而不是静态、无色的原始HTML文件,浏览器必须重复请求过程,获取每个引用文件。HTML、图像、用于样式的CSS和用于额外行为的JavaScript文件都是使用完全相同的HTTP请求过程获取的。

几乎所有发生在互联网上的互动都是这个基本过程。一个基本的网页可能只需要几个简单的请求就可以完全呈现,而一个现代的大型网页可能需要数百个请求。在撰写本文时,亚马逊主页(www.amazon.com)发出606个请求,其中包括3个CSS文件、12个JavaScript文件和402个图像文件!

既然现在您已经了解了该过程,让我们看看ASP.NET Core如何在服务器上动态生成响应。

1.3.2  ASP.NET Core如何处理请求?

使用ASP.NET Core构建web应用程序时,浏览器仍将使用与以前相同的HTTP协议与应用程序通信。ASP.NET Core本身包含了在服务器上处理请求所要求的一切,包括验证请求是否有效、处理登录详细信息以及生成HTML。

与通用网页示例一样,当用户的浏览器向服务器发送HTTP请求时,请求过程开始,如图1.9所示。

 图1.9  ASP.NET Core应用程序如何处理请求。ASP.NET Core应用程序接收请求,该应用程序运行自托管web服务器。web服务器处理请求并将其传递给应用程序主体,后者生成响应并将其返回给web服务器。web服务器将此响应发送到浏览器

ASP.NET Core应用程序从网络接收请求。每个ASP.NET Core应用程序都有一个内置的web服务器,默认情况下是Kestrel,它负责接收原始请求并构造数据的内部表示,即HttpContext对象,该对象可供应用程序的其他部分使用。

从这个对象中,应用程序应该具有创建对请求的适当响应所需的所有细节。它可以使用存储在HttpContext中的详细信息来生成适当的响应,这可能是生成一些HTML、返回“拒绝访问”消息或发送电子邮件,所有这些都取决于应用程序的要求。

应用程序完成处理请求后,将向web服务器返回响应。ASP.NET Core web服务器将表示转换为原始HTTP响应并将其发送到网络,网络将其转发到用户的浏览器。

 对于用户来说,这个过程似乎与图1.8所示的通用HTTP请求相同,用户发送了一个HTTP请求并收到了一个响应。所有的区别都是服务器端的应用程序中。

ASP.NET Core和反向代理
您可以将ASP.NET Core应用程序直接暴露到internet,以便Kestrel直接从网络接收请求。然而,在原始网络和应用程序之间使用反向代理更为常见。在Windows中,反向代理服务器通常是IIS,而在Linux或macOS上,它可能是NGINX、HAProxy或Apache。
反向代理是负责接收请求并将其转发到适当的web服务器的软件。反向代理直接暴露于互联网,而底层web服务器仅暴露于代理。此设置具有多种好处,主要是web服务器的安全性和性能。
您可能认为拥有反向代理和web服务器有些多余。为什么不选一个呢?其中一个好处是应用程序与底层操作系统的分离。同一个ASP.NET Core web服务器Kestrel可以跨平台使用,并且可以在各种代理后面使用,而不会对特定的实现施加任何限制。或者,如果您编写了一个新的ASP.NET Core web服务器,您可以使用它来代替Kestrel,而无需更改应用程序的其他任何内容。
反向代理的另一个好处是它可以抵御来自公共互联网的潜在威胁。他们通常负责其他方面,例如重新启动已崩溃的进程。Kestrel仍然是一个简单的HTTP服务器,在反向代理后面使用时,不必担心这些额外的功能。将其视为关注点的简单分离:Kestrel关注生成HTTP响应;反向代理与处理到internet的连接有关。

您已经看到了请求和响应是如何往返于ASP.NET Core应用程序的,但我还没有谈到响应是如何生成的。在本书的第1部分中,我们将了解构成典型ASP.NET Core应用程序的组件以及它们如何组合在一起。在ASP.NET Core中生成响应需要时间,通常都在一秒钟内完成,但在本书的过程中,我们将缓慢地完成一个应用程序,详细介绍每个组件。

1.4 你将在本书中学到什么

本书将带您深入了解ASP.NET Core框架。要从书中受益,您应该熟悉C#或类似的面向对象语言。对HTML和JavaScript等web概念的基本熟悉也将是有益的。你会学到

  • 如何使用Razor Pages创建基于页面的应用程序
  • ASP.NET Core的关键概念,如模型绑定、验证和路由
  • 如何使用Razor语法和标记帮助程序为网页生成HTML
  • 在应用程序变得更复杂时使用依赖注入、配置和日志记录等功能
  • 如何使用最安全的办法来保护应用程序

在本书中,我们将使用各种示例来学习和探索概念。这些示例通常都很小且独立,因此我们可以一次专注于单个功能。

我将在本书的大部分示例中使用Visual Studio,但您将能够使用您喜爱的编辑器或IDE进行后续操作。附录A包括设置编辑器或IDE以及安装.NET5.0SDK的详细信息。尽管本书中的示例展示了Windows工具,但在Linux或Mac平台上,您所看到的一切都可以实现得很好。

提示:您可以从以下位置安装.NET 5.0,https://dotnet.microsoft.com/download。附录A包含有关如何配置开发环境以使用ASP.NET Core和.NET5.0的更多详细信息

在下一章中,您将从模板创建第一个应用程序并运行它。我们将详细介绍构成应用程序的每个主要组件,并了解它们是如何协同工作来呈现网页的。

总结

  • ASP.NET Core是一个以现代软件体系结构和模块化为重点构建的新web框架。
  • 它最适合用于新的“green-field”项目。
  • 传统技术(如WCF服务器和Web表单)不能与ASP.NET Core一起使用。
  • ASP.NET Core在跨平台.NET 5.0平台上运行。您可以使用Windows兼容包访问Windows特定功能,如Windows注册表。
  •  .NET 5.0是.NET Core 3.1之后的下一个版本。
  • 获取网页涉及发送HTTP请求和接收HTTP响应。
  • ASP.NET Core允许您动态构建对给定请求的响应。
  • ASP.NET Core应用程序包含web服务器,该服务器充当请求的入口点。
  • ASP.NET Core应用程序通常由反向代理服务器保护,该服务器将请求转发到应用程序。

如需导航到本书的其他章节,请点击这里...

posted on 2022-12-07 12:42  生活的倒影  阅读(293)  评论(0编辑  收藏  举报