在Web应用研发领域容器编排、微服务、服务网格等先进架构已大行其道的今天,本书作为ASP.NET Core的入门教程,可以让广大开发人员在自己的技能列表里添加上这个关键项。本书从ASP.NET Core的核心组件入手,延伸到MVC、WebAPI、SignalR(实时通信应用)、Blazor(wasm应用)、机器学习等多种应用开发,全方位地讲解ASP.NET Core的应用场景、开发实践和部署发布,带领读者学习从开发到发布基于ASP.NET Core项目的全过程。
本书主要针对的是对C#语法和Web开发有一定了解、期望使用C#语言开发Web项目的初学者,也可以是具有ASP.NET MVC开发经验、希望通过ASP.NET Core提升跨平台和容器化开发能力的开发者。
封面图
目录
- 前言
- 第1章 为什么选择ASP.NET Core1
- 1.1 什么是.NET1
- 1.2 ASP.NET Core的特点3
- 1.3 读者能从本书学到什么4
- 第2章 ASP.NET Core开发工具安装6
- 2.1 .NET Core SDK安装6
- 2.1.1 获取.NET Core SDK6
- 2.1.2 安装.NET Core SDK7
- 2.2 Visual Studio Code安装7
- 2.2.1 获取Visual Studio Code8
- 2.2.2 安装Visual Studio Code8
- 2.2.3 更新Visual Studio Code10
- 2.3 Visual Studio 2019安装10
- 2.3.1 确保计算机可以安装Visual Studio10
- 2.3.2 获取 Visual Studio11
- 2.3.3 安装Visual Studio安装程序11
- 2.3.4 启动安装程序12
- 第3章 ASP.NET Core核心组件详解13
- 3.1 框架总述13
- 3.2 依赖注入14
- 3.2.1 什么是依赖注入14
- 3.2.2 依赖注入组件15
- 3.2.3 服务描述类ServiceDescriptor16
- 3.2.4 IServiceCollection与服务注册18
- 3.2.5 通过IServiceProvider获取服务实例20
- 3.2.6 作用域与生命周期22
- 3.2.7 IDisposable与生命周期25
-
3.2.8 扩展接口IServiceProviderFactory
25 -
3.2.9 在Controller中获取服务28 -
3.3 配置组件29 -
3.3.1 配置组件的构造过程29 -
3.3.2 内存配置提供程序32 -
3.3.3 命令行配置提供程序32 -
3.3.4 环境变量配置提供程序34 -
3.3.5 文件配置提供程序35 -
3.3.6 Key-per-file配置提供程序37 -
3.3.7 使用IConfiguration读取配置38 -
3.3.8 使用强类型接收配置40 -
3.4 选项组件42 -
3.4.1 选项的注入与使用42 -
3.4.2 使用命名选项44 -
3.4.3 验证选项46 -
3.4.4 选项后期配置47 -
3.5 中间件48 -
3.5.1 注册中间件49 -
3.5.2 常用的内置中间件51 -
3.6 路由与终结点52 -
3.6.1 注册终结点53 -
3.6.2 路由模板54 -
3.6.3 特性路由55 -
3.6.4 路由约束56 -
3.6.5 生成链接57 -
第4章 基于MVC设计模式的Web应用59 -
4.1 创建第一个ASP.NET Core MVC项目59 -
4.2 什么是MVC模式63 -
4.3 视图64 -
4.3.1 使用视图的好处65 -
4.3.2 创建视图66 -
4.3.3 利用控制器指定视图66 -
4.3.4 视图发现67 -
4.3.5 向视图传递数据68 -
4.3.6 动态视图72 -
4.4 部分视图73 -
4.4.1 何时使用部分视图73 -
4.4.2 声明部分视图73 -
4.4.3 引用部分视图74 -
4.4.4 呈现部分视图75 -
4.4.5 通过部分视图访问数据76 -
4.5 控制器78 -
4.5.1 什么是控制器78 -
4.5.2 Action79 -
4.5.3 横切关注点80 -
4.6 路由80 -
4.6.1 自定义路由81 -
4.6.2 混合路由82 -
4.6.3 动态路由82 -
4.7 区域85 -
4.8 筛选器89 -
4.8.1 筛选器的工作原理90 -
4.8.2 实现91 -
4.9 模型绑定器95 -
4.9.1 什么是模型绑定95 -
4.9.2 目标96 -
4.9.3 源97 -
4.9.4 不存在模型属性的源98 -
4.9.5 类型转换错误99 -
4.9.6 复杂类型99 -
4.9.7 集合101 -
4.9.8 字典102 -
4.9.9 模型绑定路由数据和URL字符串参数的全局行为102 -
4.9.10 特殊数据类型103 -
4.9.11 输入格式化程序103 -
4.9.12 从模型绑定中排除指定类型105 -
4.9.13 手动模型绑定106 -
第5章 基于ASP.NET Core的Web API107 -
5.1 创建ASP.NET Core的Web API项目107 -
5.2 带有Swagger的Web API帮助页111 -
5.2.1 Swashbuckle.AspNetCore111 -
5.2.2 Swagger规范112 -
5.2.3 Swagger UI113 -
5.3 ASP.NET Core Web API中控制器的返回类型114 -
5.3.1 特定类型114 -
5.3.2 IActionResult 类型115 -
5.3.3 ActionResult 类型117 -
5.4 Web API约定118 -
5.4.1 应用Web API约定119 -
5.4.2 创建Web API约定120 -
第6章 ASP.NET Core中的数据库访问122 -
6.1 Entity Framework Core122 -
6.2 安装并运行MySQL123 -
6.2.1 启动MySQL125 -
6.2.2 创建数据库125 -
6.3 数据库访问126 -
6.3.1 添加数据库上下文126 -
6.3.2 创建控制器127 -
6.4 .NET Core Dapper128 -
第7章 安全与身份认证129 -
7.1 身份认证129 -
7.1.1 身份认证处理程序130 -
7.1.2 身份认证方案130 -
7.1.3 身份认证服务130 -
7.1.4 身份认证中间件131 -
7.1.5 添加基于策略的身份认证方案132 -
7.1.6 用户信息模型133 -
7.1.7 添加自定义身份认证处理程序133 -
7.2 授权135 -
7.2.1 简单授权135 -
7.2.2 基于角色的授权136 -
7.2.3 基于策略的授权137 -
7.2.4 授权中间件137 -
7.2.5 授权处理程序138 -
7.2.6 自定义授权处理程序139 -
7.3 集成IdentityServer4139 -
7.4 数据保护141 -
7.4.1 数据保护入门142 -
7.4.2 用户机密管理143 -
7.4.3 小结143 -
7.5 强制HTTPS143 -
7.5.1 RequireHttpsAttribute144 -
7.5.2 HTTPS重定向中间件144 -
7.5.3 HTTP严格传输安全协议145 -
7.6 防跨站请求伪造145 -
7.6.1 什么是跨站请求伪造146 -
7.6.2 同步令牌模式146 -
7.7 防开放重定向攻击147 -
7.8 防跨站脚本148 -
7.8.1 防范跨站脚本攻击149 -
7.8.2 使用Razor的HTML编码149 -
7.8.3 使用Razor的JavaScript编码149 -
7.8.4 小结150 -
7.9 跨域请求150 -
7.9.1 跨域资源共享150 -
7.9.2 启用CORS中间件150 -
7.9.3 配置需要CORS的资源路径152 -
7.9.4 小结152 -
第8章 基于SignalR开发实时通信应用153 -
8.1 基于SignalR的实时通信153 -
8.1.1 数据交互传输153 -
8.1.2 Hub中心154 -
8.2 服务端实现155 -
8.2.1 创建和使用Hub155 -
8.2.2 启用SignalR155 -
8.2.3 上下文对象Context156 -
8.2.4 Clients对象156 -
8.2.5 向客户端发送消息157 -
8.2.6 处理连接事件158 -
8.2.7 用户和组158 -
8.2.8 服务的可扩展实现159 -
8.3 客户端实现160 -
8.3.1 创建connection对象160 -
8.3.2 使用on添加客户端方法160 -
8.3.3 使用start开始连接服务端160 -
8.3.4 使用invoke调用服务端方法161 -
8.3.5 自动连接161 -
8.3.6 手动重连163 -
第9章 基于Blazor的Web客户端技术164 -
9.1 Blazor的应用模型165 -
9.2 创建项目166 -
9.3 页面路由169 -
9.4 数据绑定171 -
9.5 组件172 -
9.5.1 模板化组件172 -
9.5.2 组件库174 -
9.6 状态管理176 -
第10章 日志与监控181 -
10.1 日志组件181 -
10.1.1 日志类别183 -
10.1.2 日志级别184 -
10.1.3 日志对象与依赖注入185 -
10.1.4 事件ID186 -
10.1.5 使用日志模板187 -
10.1.6 日志作用域188 -
10.1.7 筛选日志输出192 -
10.2 健康检查组件193 -
10.2.1 注册健康检查194 -
10.2.2 配置健康检查终结点196 -
10.2.3 自定义健康检查项198 -
10.2.4 检查结果发布器199 -
第11章 远程调用201 -
11.1 使用HttpClient调用远程API201 -
11.1.1 构造HttpClient201 -
11.1.2 发出请求203 -
11.1.3 设置代理204 -
11.1.4 处理Cookie204 -
11.2 使用HttpClientFactory机制管理HttpClient205 -
11.2.1 注册并使用HttpClientFactory205 -
11.2.2 使用命名客户端207 -
11.2.3 使用类型化客户端208 -
11.2.4 使用ConfigureHttpClient209 -
11.2.5 使用ConfigurePrimaryHttpMessageHandler210 -
11.2.6 理解生命周期211 -
11.2.7 HTTP请求管道212 -
11.2.8 使用ConfigureHttpMessageHandlerBuilder213 -
11.2.9 关于请求日志214 -
11.3 使用gRPC实现高性能远程调用215 -
11.3.1 定义接口描述216 -
11.3.2 配置服务端217 -
11.3.3 配置客户端219 -
11.3.4 使用dotnet-grpc命令行工具管理 .proto 文件引用220 -
第12章 部署ASP.NET Core应用222 -
12.1 部署到IIS中222 -
12.1.1 概述222 -
12.1.2 下载和安装ASP.NET Core模块223 -
12.1.3 部署到IIS 站点224 -
12.2 部署为Windows Service227 -
12.2.1 配置应用227 -
12.2.2 安装和运行服务228 -
12.3 部署到Linux中228 -
12.3.1 安装.NET运行时228 -
12.3.2 部署应用229 -
12.3.3 反向代理230 -
12.4 部署到Docker中231 -
12.4.1 Docker简介231 -
12.4.2 Docker术语231 -
12.4.3 生成和制作Dockerfile232 -
12.4.4 生成镜像233 -
12.4.5 部署镜像234 -
12.5 高可用架构234 -
12.5.1 概述234 -
12.5.2 应用本身的高可用保障235 -
第13章 ASP.NET Core高级内容236 -
13.1 文件提供程序236 -
13.1.1 访问本地物理文件系统237 -
13.1.2 监视文件的变化237 -
13.2 请求功能接口238 -
13.3 URL重写239 -
13.3.1 重写规则239 -
13.3.2 IRule接口241 -
13.3.3 小结242 -
13.4 缓存242 -
13.4.1 缓存标记帮助程序242 -
13.4.2 内存缓存和分布式缓存243 -
第14章 结合ML.NET实现机器学习应用245 -
14.1 机器学习简介245 -
14.1.1 什么是机器学习245 -
14.1.2 机器学习的作用246 -
14.1.3 机器学习的分类247 -
14.1.4 机器学习的典型步骤247 -
14.2 ML.NET 简介248 -
14.3 ML.NET特色功能249 -
14.4 ML.NET开发环境搭建252 -
14.4.1 安装ML.NET库252 -
14.4.2 安装Microsoft.ML.TimeSeries与Microsoft.ML.AutoML253 -
14.4.3 安装ML.NET模型生成器254 -
14.4.4 安装ML.NET命令行接口工具254 -
14.5 ML.NET快速上手255 -
14.5.1 构建模型阶段256 -
14.5.2 使用模型阶段256 -
14.6 ML.NET与ONNX实践259 -
14.6.1 准备事项260 -
14.6.2 创建控制台应用程序260 -
14.6.3 准备数据和预训练的模型260 -
14.6.4 定义输入和输出数据结构261 -
14.6.5 定义评分预测类261 -
14.6.6 使用模型进行分析和输出266 -
第15章 更多的学习途径270 -
15.1 .NET Core的学习途径270 -
15.2 其他需要关注的技术271