写作源起
2014 年,出版《ASP.NET MVC 5 框架揭秘》之后,我原本打算撰写《ASP.NET 框架揭秘》。后I来.NET Core 横空出世,我的研究方向也随之转移,于是就有了在 2019 年出版的《ASP.NET Core 3 框架揭秘》。
在 .NET 5 发布之前,我准备将这本书进行相应的升级。按照微软公布的版本差异,我觉得升级到《ASP.NET 5 框架揭秘》应该不会花费太多时间和精力,但后来的事实证明我的想法太天真了。由于这本书主要介绍的是 ASP.NET 框架的内部设计和实现,版本之间涉及的很多变化并未“记录在案”,只能通过阅读源代码的方式去发掘。本着宁缺毋滥的原则,我放弃了撰写《ASP.NET 5 框架揭秘》。现在看来这是一个明智的决定,因为 ASP.NET Core 6 是稳定的长期支持版本。另外,我也有了相对充裕的时间逐个确认书中涉及的每个特性在新版本中是否发生了变化,并进行了相应的修改,删除陈旧的内容,添加新的特性。
对于升级后的《ASP.NET Core 6 框架揭秘》,一个全局的改动就是全面切换到基于 Minimal API 的编程模式上。升级后的版本添加了一系列新的章节,如“第 10 章 对象池”“第 12 章 HTTP 调用”“第 13 章 数据保护”“第 18 章 服务器”“第 24 章 HTTPS 策略”“第 25 章 重定向”“第 26 章 限流”等。由于篇幅的限制,不得不删除一些“不那么重要”的章节。
本书内容
《ASP.NET Core 6 框架揭秘》只关注 ASP.NET Core 框架最核心的部分,即由一个服务器和若干中间件构建的管道,除了“第 1 章 编程体验”,其他章节基本上都不会涉及上层的编程框架。本书共分为以下 5 篇内容。
● 初始编程
第 1 章提供了 20 个极简的 Hello World 应用程序,带领读者感受一下 ASP.NET Core 的编程体验。这些演示实例涉及基于命令行的应用创建和 Minimal API 的编程模式,还涉及多种中间件的定义及配置选项和诊断日志的应用。第 1 章还演示了如何利用路由、MVC 和 gRPC 开发 Web 应用和 API,4 种针对 Dapr 的应用开发模型也包含在这 20 个演示实例中。
● 基础框架
ASP.NET Core 建立在一系列基础框架之上,这些独立的框架在日常的应用开发中同样被广泛地使用。第 2 篇提供的若干章节对这些基础框架进行了系统而详细的介绍,其中包括“第 2~3 章 依赖注入”“第 4 章 文件系统”“第 5~6 章 配置选项”“第 7~9 章 诊断日志”“第 10 章 对象池”“第 11 章 缓存”“第 12 章 HTTP 调用”“第 13 章 数据保护”。
● 承载系统
ASP.NET Core 应用作为一个后台服务寄宿于服务承载系统中,“第 14 章 服务承载”主要对该承载系统进行了详细介绍。ASP.NET Core 应用的承载是本书最核心的部分,“第 15~17 章 应用承载(上、中、下)”不仅对 ASP.NET Core 请求处理管道的构建和应用承载的内部流程进行了详细介绍,还对 Minimal API 的编程模型和底层的实现原理进行了详细介绍。
● 服务器概述
本书所有内容都围绕着 ASP.NET Core 请求处理管道,该管道由一个服务器和若干中间件构建。第 18 章主要对服务器的系统进行了介绍,不仅会详细介绍 Kestrel 服务器的使用和实现原理,还会介绍基于 IIS 的两种部署模式和 HTTP.SYS 的使用,以及如何自定义服务器类型。
● 中间件
服务器接收的请求会分发给中间件管道进行处理。本篇对大部分中间件的使用和实现原理进行了介绍,其中包括“第 19 章 静态文件”“第 20 章 路由”“第 21 章 异常处理”“第 22 章 响应缓存”“第 23 章 会话”“第 24 章 HTTPS 策略”“第 25 章 重定向”“第 26 章 限流”“第 27 章 认证”“第 28 章 授权”“第 29 章 跨域资源共享”“第 30 章 健康检查”。
写作特点
《ASP.NET Core 6 框架揭秘》是揭秘系列的第 6 本书。在这之前,我得到了很多热心读者的反馈,这些反馈对书中的内容基本上都持正面评价,但对写作技巧和表达方式的评价则不尽相同。
每个作者都有属于自己的写作风格,而每个读者的学习思维方式也不尽相同,两者很难出现百分之百的契合,但我还是决定在《ASP.NET Core 3 框架揭秘》的基础上对后续作品进行修改。从收到的反馈意见来看,这一改变得到了读者的认可,所以《ASP.NET Core 6 框架揭秘》沿用了这样的写作方式。
本书的写作风格可以概括为“体验先行、设计贯通、应用扩展”12 个字。大部分章节开头都会提供一些简单的演示实例,旨在让读者对 ASP.NET Core 的基本功能特性和编程模式有一个大致的了解。在此之后,我会提供背后的故事,即编程模型的设计和原理。将开头实例和架构设计融会贯通之后,读者基本上能够将学到的知识正确地应用到事件中,对应章节对此会提供一些最佳实践。秉承“对扩展开放,对改变关闭”的“开闭原则”,每个功能模块都提供了相应的扩展点,能够精准地找到并运用适合的扩展来解决真实项目开发中的问题才是终极的目标,对应章节会介绍可用的扩展点,并提供一些解决方案和演示实例。
本书综合运用“文字”“图表”“编程”这 3 种不同的“语言”来介绍每个技术主题。一图胜千言,每章都精心设计了很多图表,这些具象的图表能够帮助读者理解技术模块的总体设计、执行流程和交互方式。除了利用编程语言描述应用编程接口(API),本书还提供了 200 多个实例,这些实例具有不同的作用,有的是为了演示某个实用的编程技巧或者最佳实践,有的是为了强调一些容易忽视但很重要的技术细节,有的是为了探测和证明所述的论点。
本书在很多地方展示了一些类型的代码,但是绝大部分代码和真正的源代码是有差异的,两者的差异有以下几个原因:第一,源代码在版本更替中一直在发生改变;第二,由于篇幅的限制,删除了一些细枝末节的代码,如针对参数的验证、诊断日志的输出和异常处理等;第三,很多源代码其实都具有优化的空间。本书提供的代码片段旨在揭示设计原理和实现逻辑,不是为了向读者展示源代码。
目标读者
虽然本书关注的是 ASP.NET Core 自身框架提供的请求处理管道,而不是具体某个应用编程框架,但是本书适合大多数 .NET 技术从业人员阅读。任何好的设计都应该是简单的,唯有简单的设计才能应对后续版本更替中出现的复杂问题。ASP.NET Core 框架就是好的设计,因为自正式推出的那一刻起,该框架的总体设计基本上没有发生改变。既然设计是简单的,对大部分从业人员来说,对框架的学习也就没有什么门槛。本书采用渐进式的写作方式,对于完全没有接触过 ASP.NET Core 的开发人员也可以通过学习本书内容深入、系统地掌握这门技术。由于本书提供的大部分内容都是独一无二的,即使是资深的 .NET 开发人员,也能在书中找到很多不甚了解的盲点。