第一章 开始使用 ASP.NET Core
1.1 什么是 ASP.NET Core?
ASP.NET Core 是一个跨平台的开源应用程序框架,可用于快速构建动态 Web 应用程序。你可以使用 ASP.NET Core 构建服务器渲染的 Web 应用程序、后端服务器应用程序、可被移动应用程序使用的 HTTP API 以及更多其他应用。ASP.NET Core 运行在 .NET 7 上,这是 .NET Core 的最新版本——一个高性能、跨平台、开源的运行时。
ASP.NET Core 提供了构建应用程序所需的结构、辅助函数和框架,从而让你无需自己编写大量代码。然后,ASP.NET Core 框架代码会调用你的处理程序,处理程序又会调用应用程序业务逻辑中的方法,如图 1.1 所示。这些业务逻辑是应用程序的核心。你可以在这里与其他服务进行交互,例如数据库或远程 API,但你的业务逻辑通常不会直接依赖于 ASP.NET Core。
图 1.1 一个典型的 ASP.NET Core 应用程序由几个层组成。ASP.NET Core 框架代码处理来自客户端的请求,处理复杂的网络代码。然后,框架会调用你编写的处理程序(例如 Razor 页面和 Web API 控制器),这些处理程序使用框架提供的基本功能。最后,这些处理程序会调用你的应用程序的领域逻辑——通常是没有任何特定于 ASP.NET Core 依赖的 C# 类和对象。
1.2 你可以构建哪些类型的应用?
ASP.NET Core 提供了一个通用的 web 框架,你可以用它来构建各种各样的应用程序。ASP.NET Core 包含支持多种范式的 API。
l 最小化 API——简单的 HTTP API,可供移动应用程序或基于浏览器的单页应用程序使用。
l Web API——一种构建 HTTP API 的替代方法,比最小化 API 提供更多的结构和功能。
l gRPC API——用于使用 gRPC 协议构建高效的服务器间二进制 API。
l Razor 页面——用于构建基于页面的服务器渲染应用程序。
l MVC控制器——类似于Razor页面。模型-视图-控制器(MVC)控制器应用程序用于基于服务器的应用程序,但没有基于页面的范式。
l Blazor WebAssembly——一种基于浏览器的单页应用程序框架,使用 WebAssembly 标准,类似于 Angular、React 和 Vue 等 JavaScript 框架。
l Blazor Server——用于构建有状态的应用程序,这些应用程序在服务器端渲染,通过 WebSockets 发送 UI 事件和页面更新,以提供类似客户端单页应用的体验,但具有服务器渲染应用程序的开发简便性。
所有这些范式都基于相同的 ASP.NET Core 构建模块,例如配置和日志库,然后在其上添加额外的功能。适合您应用程序的最佳范式取决于多个因素,包括您的 API 需求、需要交互的现有应用程序的详细信息、客户使用的浏览器和操作环境的细节,以及扩展性和正常运行时间的要求。您不需要只选择其中一种范式;ASP.NET Core 可以在单个应用程序中结合多种范式。
1.3 选择 ASP.NET Core
我希望现在你对 ASP.NET Core 有了一个大致的了解,以及你可以用它构建的应用类型。但还有一个问题:你应该使用它吗?微软建议所有新的 .NET 网络开发都使用 ASP.NET Core,但对任何开发者或公司来说,切换或学习一个新的网络技术栈都是一项重大任务。
如果你是 .NET 开发的新手,并且正在考虑 ASP.NET Core,欢迎!
微软正在推广 ASP.NET Core 作为面向 web 开发初学者的有吸引力的选择,但将 .NET 推向跨平台意味着它需要与许多其他框架在各自的领域竞争。与其他跨平台 web 框架相比,ASP.NET Core 有许多优势:
l 它是一个现代的、高性能的、开源的 web 框架。
l 它使用熟悉的设计模式和范式。
l C# 是一门很棒的语言(但如果你愿意,也可以使用 VB.NET 或 F#)。
l 你可以在任何平台上进行构建和运行。
ASP.NET Core 是对 ASP.NET 框架的重新构想,它在新的 .NET 平台之上构建,采用了现代软件设计原则。虽然从某种意义上来说它是新的,但 .NET(以前称为 .NET Core)自 2016 年以来已广泛用于生产环境,并在很大程度上借鉴了成熟、稳定且可靠的 .NET Framework,而 .NET Framework 已经使用了二十多年。您可以放心,选择 ASP.NET Core 和 .NET 7,您将获得一个可靠的平台以及功能齐全的 Web 框架。
ASP.NET Core 和 .NET 7 的一个主要卖点是能够在任何平台上开发和运行。无论你使用的是 Mac、Windows 还是 Linux 电脑,你都可以运行相同的 ASP.NET Core 应用,并在多个环境中进行开发。Linux 用户支持多种发行版:RHEL、Ubuntu、Debian、CentOS、Fedora 和 openSUSE,仅举几例。ASP.NET Core 甚至可以在极小的 Alpine 发行版上运行,实现真正紧凑的容器部署,因此你可以确信所选择的操作系统是可行的选项。
如果你已经是 .NET 开发者,那么是否投资使用 ASP.NET Core 开发新应用程序,主要取决于时机。早期版本的 .NET Core 缺少一些功能,导致难以采用,但在最新版本的 .NET 中,这个问题已经不存在。现在,微软明确建议所有新的 .NET 应用程序都应使用 .NET 7(或更新版本)。
微软已承诺为旧版 ASP.NET 框架提供漏洞和安全修复,但不会再提供任何功能更新。 .NET 框架不会被移除,因此你的旧应用程序将继续运行,但不应将其用于新的开发项目。
ASP.NET Core 相对于之前的 ASP.NET 框架的主要优点是
l 跨平台开发与部署
l 将性能作为一项功能
l 简化的托管模型
l 定期发布,缩短发布周期
l 开源
l 模块化功能
l 更多的应用范式选择
l 在发布独立部署应用时,可选择将 .NET 打包在应用中
作为一名正在转向 ASP.NET Core 的现有 .NET 开发人员,您构建和部署跨平台应用的能力将为您打开全新的应用领域,例如利用云中更便宜的 Linux 虚拟机托管,使用 Docker 容器实现可重复的持续集成,或者在 Mac 上编写 .NET 代码而无需运行 Windows 虚拟机。ASP.NET Core 与 .NET 7 相结合,使所有这些成为可能。
这并不意味着您在 Windows 和 Internet Information Services (IIS) 上部署 ASP.NET 应用程序的经验被浪费。相反,ASP.NET Core 使用了许多与之前的 ASP.NET 框架相同的概念,您仍然可以在 IIS 上运行 ASP.NET Core 应用程序,因此迁移到 ASP.NET Core 并不意味着从零开始。
1.4 ASP.NET Core 是如何工作的?
我已经介绍了 ASP.NET Core 的基础知识,它的用途,以及为什么你应该考虑使用它。在本节中,你将看到使用 ASP.NET Core 构建的应用程序是如何工作的,从用户对某个 URL 的请求到在浏览器中显示页面。为了理解这一过程,首先你将了解 HTTP 请求对于任何 Web 服务器的工作方式;然后你将看到 ASP.NET Core 如何扩展这一过程来创建动态网页。
1.4.1 HTTP 网络请求是如何工作的?
正如你现在所知道的,ASP.NET Core 是一个用于构建从服务器提供数据的 Web 应用程序的框架。对于 Web 开发人员来说,最常见的场景之一是构建一个可以在 Web 浏览器中查看的 Web 应用程序。图 1.2 显示了你可以从任何 Web 服务器预期的高级流程。
当用户访问网站或在浏览器中输入网址时,流程就开始了。网址由主机名和指向网页应用程序上某个资源的路径组成。在浏览器中访问该地址会使用 HTTP 协议从用户的计算机向托管网页应用程序的服务器发送请求。
定义 网站的主机名通过域名服务(DNS)映射到IP地址,从而在互联网上唯一标识其位置。 示例包括 microsoft.com、www.google.co.uk 和 facebook.com。
HTTP 简明指南
超文本传输协议(HTTP)是支撑万维网的应用层协议。它是一种无状态的请求-响应协议,其中客户端发送请求到服务器,服务器随后返回响应。
每个 HTTP 请求都包含一个动词,用于指明请求类型,以及一个路径,用于指明要操作的资源。请求通常还包括请求头(即键值对),在某些情况下还会包含请求体,例如在向服务器发送数据时的表单内容。
HTTP 响应包含状态码,用于指示请求是否成功,并可选择性地包含响应头和响应体。
想要更详细地了解 HTTP 协议本身以及更多示例,请参阅 Sau Sheong Chang 著《Go Web Programming》(Manning, 2016)第 1.3 节(“HTTP 快速入门”),网址:mng.bz/x4mB。你也可以阅读… RFC 规范,网址:www.rfc-editor.org/rfc/rfc9110…
请求通过互联网传输,可能到达世界的另一端,直到最终到达与给定主机名关联的服务器上,该服务器上运行着 web 应用程序。请求可能会在途中被多个路由器接收和转发,但只有当它到达与主机名关联的服务器时,才会处理该请求。
当服务器收到请求时,它会处理该请求并生成一个HTTP响应。根据请求的不同,这个响应可能是一个网页、一个图像、一个JavaScript文件、一个简单的确认信息,或者几乎任何其他文件。在这个例子中,我假设用户已经访问了一个网络应用的主页,因此服务器会以一些HTML进行响应。HTML被添加到HTTP响应中,然后通过互联网发送回发出请求的浏览器。
一旦用户的浏览器开始接收 HTTP 响应,它就可以开始在屏幕上显示内容,但 HTML 页面也可能引用服务器上的其他页面和链接。为了显示完整的网页,而不是静态、无色的原始 HTML 文件,浏览器必须重复请求过程,获取每个引用的文件。HTML、图像、用于样式的层叠样式表(CSS)以及用于额外功能的 JavaScript 文件,都是通过完全相同的 HTTP 请求过程获取的。
几乎所有在互联网上发生的交互都是建立在这个基本过程之上的表象。一个基本的网页可能只需要几个简单的请求就能完全呈现,而一个大型的现代网页可能需要数百个请求。在撰写本文时,亚马逊首页(www.amazon.com)发起了410个请求,包括4个CSS文件、12个JavaScript文件和299个图片文件的请求!现在你已经对这个过程有了一定的了解,让我们看看ASP.NET Core如何在服务器上动态生成响应。
1.4.2 ASP.NET Core 是如何处理请求的?
当你使用 ASP.NET Core 构建 Web 应用程序时,浏览器仍然会使用与以前相同的 HTTP 协议与应用程序进行通信。ASP.NET Core 本身涵盖了服务器上处理请求的所有内容,包括验证请求是否有效、处理登录信息以及生成 HTML。与通用网页示例一样,请求过程从用户的浏览器向服务器发送 HTTP 请求时开始,如图 1.3 所示。
图 1.3 ASP.NET Core 应用程序如何处理请求。请求会被 ASP.NET Core 应用程序接收,该应用程序运行一个自托管的网页服务器。网页服务器处理该请求并将其传递给应用程序主体,应用程序生成响应并将其返回给网页服务器。网页服务器将该响应发送到浏览器。
请求由您的 ASP.NET Core 应用程序从网络接收。每个 ASP.NET Core 应用程序都有一个内置的 Web 服务器——默认是 Kestrel——负责接收原始请求并构建数据的内部表示形式,即 HttpContext 对象,供应用程序的其他部分使用。
您的应用程序可以使用存储在 HttpContext 中的详细信息来生成对请求的适当响应,这可能是生成一些 HTML、返回“访问被拒绝”消息或发送电子邮件,这一切都取决于您的应用程序需求。
当应用程序完成请求处理后,它会将响应返回给 Web 服务器。ASP.NET Core Web 服务器将表示转换为原始 HTTP 响应并发送到网络,网络再将其转发到用户的浏览器。对于用户而言,这个过程看起来与图 1.2 中显示的一般 HTTP 请求相同:用户发送了 HTTP 请求并收到了 HTTP 响应。所有差异都存在于服务器端,在您的应用程序内部。
您已经了解了请求和响应如何在 ASP.NET Core 应用程序中传递,但我尚未涉及响应是如何生成的。在本书中,我们将了解构成典型 ASP.NET Core 应用程序的各个组件以及它们是如何协同工作的。在 ASP.NET Core 中生成响应涉及很多内容,通常是在几分之一秒内完成的,但在本书中,我们将慢慢地一步步讲解一个应用程序,详细介绍每个组件。
1.5 你将在本书中学到的内容
本书将带您深入了解ASP.NET Core框架。为了从这本书中受益,你应该熟悉C#或类似的面向对象语言。对HTML和JavaScript等网络概念的基本熟悉也将是有益的。您将学习以下内容:
l 如何使用最少的API构建HTTP API应用程序
l 如何使用Razor Pages创建基于页面的应用程序
l 关键ASP.NET Core概念,如模型绑定、验证和路由
l 如何使用Razor语法和Tag Helpers为网页生成HTML
l 随着应用程序变得更加复杂,如何使用依赖注入、配置和日志记录等功能
l 如何通过使用安全最佳实践来保护您的应用程序
在本书中,我们将使用各种例子来学习和探索概念。这些示例通常很小,并且是自包含的,这样我们就可以一次专注于一个功能。
本书中的大部分示例都将使用Visual Studio,但您也可以使用您最喜欢的编辑器或集成开发环境(IDE)进行后续操作。附录A包括设置编辑器或IDE以及安装的详细信息。NET 7软件开发工具包(SDK)。尽管本书中的示例展示了Windows工具,但您所看到的一切都可以在Linux或Mac平台上很好地实现。
提示 你可以从 dotnet.microsoft.com/download 安装 .NET 7。 附录 A 包含有关配置开发环境以使用 ASP.NET Core 和 .NET 7 的更多详细信息。
在第2章中,我们将更深入地探讨使用ASP.NET Core可以创建的应用类型。我们还将探讨它相对于旧版ASP.NET和.NET Framework平台的优势。
总结
l ASP.NET Core 是一个跨平台、开源、高性能的 Web 框架。
l ASP.NET Core 运行在 .NET 上,之前称为 .NET Core。
l 你可以使用 Razor 页面或 MVC 控制器来构建服务器渲染的页面型 Web 应用。
l 你可以使用最小化 API 或 Web API 来构建 RESTful 或 HTTP API。
l 你可以使用 gRPC 来构建高效的服务器间 RPC 应用。
l 你可以使用 Blazor WebAssembly 来构建在浏览器中运行的客户端应用,使用 Blazor Server 来构建有状态的服务器渲染应用,通过 WebSocket 连接发送 UI 更新。
l 微软建议在所有新的 Web 开发中使用 ASP.NET Core 和 .NET 7 或更高版本,而不是使用传统的 ASP.NET 和 .NET Framework 平台。
l 获取网页涉及发送 HTTP 请求并接收 HTTP 响应。
l ASP.NET Core 允许你动态构建对特定请求的响应。
l ASP.NET Core 应用包含一个 Web 服务器,它作为请求的入口点。