C#与.NET6开发从入门到实践

C#与.NET6开发从入门到实践"

作者:敖瑞
ISBN:9787302621980
定价:¥169
字数:千字
页数:
出版时间:2023.03.01
开本:
版次:1-1
装帧:
出版社:清华大学出版社
简介

本书以ASP.NET Core项目为例,系统地介绍了.NET6的各个重要知识点。书中内容融合了作者多年实践的丰富经验,讲解深入浅出,全面且细致。

本书共分为四篇25章。第一篇(第1~3章)是.NET 6基础篇,主要介绍.NET平台、C#语言和Visual Studio开发环境的常用功能和特性。第二篇(第4~10章)是Entity Framework Core篇,主要介绍Entity Framework Core的各种功能和使用方法,包括快速入门、实体模型、实体模型的关系、管理实体模型和数据库架构、管理数据、查询数据、Entity Framework Core共享功能等内容。第三篇(第11~24章)是ASP.NET Core篇,主要介绍ASP.NET Core框架的基础知识、身份认证、授权、MVC、Razor Pages、Blazor、Razor类库、Web API、远程过程调用、实时通信、应用安全、高级功能等内容。第四篇(第25章)是实战演练篇,用一个功能完整的电子商城项目来串联前面三篇介绍的大部分功能,帮助读者跨越从基础知识的学习到实际应用的门槛。

本书以.NET 6的入门学习者和有其他C系语言的使用经验并有意了解ASP.NET Core的人为主要目标读者,同时适合被中高级开发者当作功能模块速查和学习高级功能的手册,还可以作为高等院校相关专业的教学用书和培训学校的教材。

前言

前    言

.NET作为新近崛起的开发框架,它继承了前辈.NET Framework的大量优点,并针对新时代的需求进行了大量改进。拥抱开源跨平台的.NET得到大量优秀开发者的喜爱和支持,发展势头迅猛。历经6代更新,目前的.NET也日趋稳定,基础框架的大量知识在可预见的将来不会发生大幅变动,学习曲线会逐步平稳。对于将来的新版本,用户基本可以只用补充了解新内容而不必担心已有知识被颠覆或废弃。

ASP.NET Core是一个专为Web开发而准备的基础框架,作为其基础的.NET框架势必是不能无视的,更何况ASP.NET Core中使用的大量功能其实是.NET的通用功能,只不过因其在ASP.NET Core中非常有用而被默认集成。为了避免读者把这些默认集成的功能误以为是ASP.NET Core的专用功能,笔者在书中的文字段落和示例代码中给予了明确的提示,这也是为本书取名的一大考虑。虽然本书以ASP.NET Core为例进行深入解析,但其中的大量知识其实通用于整个.NET,故书名取为“.NET入门”而不是“ASP.NET Core入门”。以ASP.NET Core为例进行深入解析则是因为现在是大Web时代,ASP.NET Core最具有通用性和代表性,能覆盖最广的场景。

笔者自大学时期接触软件开发以来,读到的入门学习的书多为项目实例与知识讲解交织在一起的一类书。笔者在阅读时颇为苦恼,每次想要专门查阅某个细节时总是很难快速定位,又或者知识点被分散到多个位置,要来回翻看。因此在本书的编写中笔者采用了分离基础知识和综合练习的形式,并在综合练习中展示相关知识点的引用。希望广大读者由此能得到更好的阅读体验。

在现代Web技术中,渐进式Web应用和Web Assembly无疑是最耀眼的新星,甚至取代了大量曾经的本地桌面应用。Blazor作为这两项技术的融合和工程化的代表却没有在中文书籍中获得应有的篇幅予以介绍,因此本书将Blazor作为和MVC、Razor Pages等页面渲染框架同等重要的技术来介绍,并在第四篇实战演练中作为一个关键组成部分予以应用。

现代Web应用的复杂性日趋提升,普通的Web API在面对这种复杂性时颇为艰难。为此新一代数据访问技术GraphQL进入广大开发者的视野。但较为可惜的是,这项技术似乎被许多人误解并认为难以应用到项目中。这固然有GraphQL本身的复杂性导致的部分原因,但是开发者的错误认知导致的误解是更为主要的原因。为了让.NET开发者能直接体会到GraphQL的广泛适用性,本书选择了在Blazor应用中使用该技术提供数据支持。

随着物联网的发展,应用软件需要更紧密地和底层硬件结合,这导致了软件开发语言选择的困难。想要顺利接入硬件势必要使用能访问硬件的底层语言,例如C语言,但是底层语言在开发上层应用时却非常麻烦,本就复杂的业务和底层语言的各种细节搅在一起实在是对人的一种折磨。这时为上层应用和底层硬件分别选用不同的语言和框架似乎是不错的选择,但偏偏高级语言和底层语言的交互又成了个大麻烦。此时C#和.NET便成为了广大开发者的得力助手。.NET从一开始就非常重视和本机代码交互的功能,但是无论如何,互操作代码的编写还是有无法避免的内在复杂性,为此笔者专门在书中介绍了一些简化互操作开发的方法和模块。

对于希望入门.NET 6以及有其他的C系语言的使用经验的读者,本书系统地梳理了C#的发展历程,并以此为线索介绍C#的各种功能和语言特性,还与常用的C系语言进行对比,方便读者根据需要选用合适的方法实现功能、互相移植其他语言和C#的代码。对于中高级开发者,本书介绍了一些优秀的第三方模块,希望能为开发者提供一些参考。本书对除第四篇“实战演练”之外的其他内容进行了归类整理,并根据内容之间的依赖关系调整了先后顺序,由此可以衍生出三种阅读方式:对于初学者,推荐按顺序阅读,这样可以由浅入深地逐步学习,并确保不会在阅读时遇到和主要内容无关的未知知识点;对于中高级开发者,可以直接阅读实战演练篇并跟着练习,然后在练习中有针对性地阅读不熟悉的知识点;对于二次阅读的读者,本书则可以当作速查手册使用,本书的内容归类和目录都针对速查进行了专门的设计和编排。

本书配套的PPT和源代码需要使用微信扫描下面的二维码获取,可按扫描后的页面提示填写你的邮箱,把下载链接转发到邮箱中下载。如果发现问题或有疑问,请用电子邮件联系booksaga@126.com,邮件主题为“C#与.NET 6开发从入门到实践”。

                        

 PPT                                  源代码

本书是笔者编写的第一本书,它倾注了笔者的大量心血和多年经验积累的心得体会,但是由于笔者的文字功底、时间和篇幅等问题,不可避免地会出现疏漏。欢迎广大读者提出建议,笔者愿积极与读者交流,希望本书能发挥出更大的价值,不负笔者付出的努力和时间。

编者

2023年1月

目录

目    录

第一篇  .NET 6基础

第1章  构建.NET 6开发环境 3

1.1  .NET、.NET Core、.NET Standard与.NET Framework 3

1.2  ASP.NET Core与ASP.NET 4

1.3  其他.NET应用模型 4

1.4  Visual Studio简介 4

1.5  安装Visual Studio 5

1.6  小结 7

第2章  Visual Studio的解决方案和项目 8

2.1  解决方案和项目简介 8

2.2  创建解决方案和项目 8

2.2.1  创建方法 8

2.2.2  操作演示和说明 9

2.3  引用其他项目和第三方程序包 12

2.3.1  引用其他项目 12

2.3.2  引用第三方程序包 13

2.3.3  卸载程序包和项目引用 16

2.4  .NET主要项目类型 16

2.5  解决方案和项目文件解析 16

2.5.1  解决方案文件 16

2.5.2  项目文件 17

2.6  小结 18

第3章  C#发展史 19

3.1  简介 19

3.2  C# 1.0 19

3.2.1  类、结构体和联合体 20

3.2.2  接口 22

3.2.3  属性 23

3.2.4  委托 26

3.2.5  事件 28

3.2.6  运算符和表达式 29

3.2.7  语句 31

3.2.8  命名空间 31

3.2.9  特性 32

3.2.10  unsafe上下文 33

3.3  C# 2.0 35

3.3.1  泛型 35

3.3.2  协变和逆变 38

3.3.3  委托的方法组转换 39

3.3.4  分部类型 39

3.3.5  匿名方法 40

3.3.6  可为null的结构体 40

3.3.7  枚举器 41

3.3.8  静态类 41

3.3.9  独立的属性访问器保护级别 43

3.3.10  委托类型推断 43

3.4  C# 3.0 44

3.4.1  自动实现属性 44

3.4.2  分部方法 44

3.4.3  对象初始化器 45

3.4.4  隐式类型的本地变量 45

3.4.5  匿名类型 46

3.4.6  Lambda表达式 46

3.4.7  表达式树 47

3.4.8  扩展方法 47

3.4.9  LINQ(Language-Integrated Query) 48

3.5  C# 4.0 50

3.5.1  动态绑定 50

3.5.2  可选参数和命名参数 50

3.5.3  嵌入的互操作类型 51

3.5.4  泛型的协变和逆变 51

3.6  C# 5.0 52

3.6.1  调用方信息特性 52

3.6.2  异步成员 52

3.7  C# 6.0 53

3.7.1  静态导入 53

3.7.2  异常筛选器 54

3.7.3  表达式体成员 54

3.7.4  自动属性初始化表达式 55

3.7.5  索引初始化器 55

3.7.6  null引用传播运算符 55

3.7.7  字符串内插 56

3.7.8  nameof运算符 57

3.7.9  catch和finally块中的await 57

3.7.10  Roslyn 57

3.8  C# 7.0 60

3.8.1  out变量 60

3.8.2  元组、解构和弃元 60

3.8.3  模式匹配 61

3.8.4  本地函数 62

3.8.5  表达式体成员增强 63

3.8.6  二进制文本和数字分隔符 63

3.8.7  throw表达式 63

3.8.8  ref局部变量和返回值 63

3.9  C# 7.1 64

3.9.1  异步主函数 64

3.9.2  default表达式 64

3.9.3  元组元素名称推断 65

3.9.4  泛型类型参数的模式匹配 65

3.10  C# 7.2 65

3.10.1  非尾随命名参数 65

3.10.2  数值文本的前导下画线 66

3.10.3  private protected访问修饰符 66

3.10.4  针对参数的in修饰符 66

3.10.5  针对方法返回值的ref readonly修饰符 67

3.10.6  readonly struct结构体 67

3.10.7  ref struct结构体 68

3.10.8  条件ref表达式 68

3.11  C# 7.3 68

3.11.1  非托管类型和泛型约束增强 68

3.11.2  无须固定即可访问固定的字段 69

3.11.3  可以重新分配ref局部变量 69

3.11.4  可以使用stackalloc数组上的初始值设定项 69

3.11.5  更多类型支持fixed语句 70

3.11.6  元组支持“==”和“!=”操作符 70

3.11.7  支持为自动实现属性的后台字段添加特性 70

3.11.8  增强包含in修饰符的方法重载的选择策略 70

3.11.9  扩展out变量的适用范围 71

3.11.10  改进方法重载的选择策略 71

3.12  C# 8.0 71

3.12.1  默认接口方法 71

3.12.2  模式匹配增强 72

3.12.3  结构体的readonly成员 75

3.12.4  using声明 75

3.12.5  静态本地函数 76

3.12.6  可释放的ref struct 76

3.12.7  可为null的引用类型 76

3.12.8  异步可释放 77

3.12.9  异步枚举器 78

3.12.10  索引和范围 79

3.12.11  null合并赋值 80

3.12.12  非托管泛型结构体 80

3.12.13  嵌套表达式中的stackalloc 80

3.12.14  内插字符串和逐字字符串 80

3.13  C# 9.0 81

3.13.1  init属性访问器 81

3.13.2  记录 81

3.13.3  顶级程序 83

3.13.4  模式匹配增强 84

3.14  本机大小的整数 85

3.14.1  函数指针 85

3.14.2  禁止本地初始化特性 86

3.14.3  静态匿名函数 87

3.14.4  类型推导的new表达式 87

3.14.5  类型推导的条件表达式 88

3.14.6  协变返回类型 88

3.14.7  foreach循环支持GetEnumerator扩展方法 88

3.14.8  参数弃元 89

3.14.9  本地函数支持特性 89

3.14.10  模块初始化器 90

3.14.11  分部方法增强 90

3.14.12  源生成器 91

3.15  C# 10.0 91

3.15.1  结构体记录 91

3.15.2  结构体允许自定义公共无参构造函数 91

3.15.3  强化的with表达式 92

3.15.4  记录允许密封ToString方法 92

3.15.5  全局using 92

3.15.6  文件范围的命名空间 93

3.15.7  常量内插字符串 93

3.15.8  内插字符串处理程序 93

3.15.9  Lambda表达式增强 93

3.15.10  CallerArgumentExpression诊断特性 94

3.15.11  解构支持混合使用已有变量和内联声明变量 94

3.15.12  增强的属性模式 94

3.15.13  方法上的自定义异步状态机特性 95

3.16  小结 95

第二篇  Entity Framework Core

第4章  快速入门 99

4.1  简介 99

4.2  创建项目和安装EF Core 99

4.3  创建数据模型 99

4.4  创建数据上下文 100

4.5  创建数据库 100

4.6  简单使用 101

4.7  小结 102

第5章  实体模型 103

5.1  实体类型和实体模型配置 103

5.1.1  基本实体类型 104

5.1.2  基础实体模型配置 105

5.1.3  排序规则 108

5.1.4  值生成和计算属性 109

5.1.5  影子属性 112

5.1.6  幕后字段 112

5.1.7  模型字段 113

5.1.8  键 114

5.1.9  索引 117

5.1.10  并发标记与行版本 118

5.1.11  值转换器 119

5.1.12  值比较器和属性快照 121

5.1.13  数据种子 123

5.1.14  构造函数 124

5.1.15  继承 127

5.1.16  无键实体类型 129

5.1.17  实体的多重映射 130

5.1.18  索引器属性、共享类型实体和属性包 131

5.2  全局查询过滤器 132

5.3  自定义实体模型注解 132

5.4  自定义数据库函数和映射 133

5.4.1  标量值函数映射 133

5.4.2  表值函数映射 134

5.4.3  存储过程映射 135

5.5  在一个上下文类型中使用多个模型 136

5.6  小结 137

第6章  实体模型的关系 138

6.1  概念和术语简介 138

6.2  实体模型的关系与影子属性 138

6.3  一对一关系 139

6.3.1  实体类型和关系配置 140

6.3.2  表共享(表拆分) 141

6.3.3  从属实体类型 142

6.4  一对多关系 143

6.4.1  实体类型和关系配置 143

6.4.2  自关联与树形实体类型 145

6.4.3  从属实体类型的集合 145

6.5  多对多关系 146

6.5.1  显式映射 146

6.5.2  隐式映射 148

6.6  模型关系的级联删除 149

6.7  小结 151

第7章  管理实体模型和数据库架构 152

7.1  迁移 152

7.1.1  安装迁移工具 153

7.1.2  管理迁移 154

7.1.3  应用迁移 155

7.1.4  自定义迁移操作 156

7.1.5  使用独立的迁移项目 162

7.1.6  为模型提供多个迁移 163

7.1.7  自定义迁移历史记录 164

7.2  逆向工程 165

7.3  EF Core Power Tools 165

7.4  小结 165

第8章  管理数据 166

8.1  基础保存 166

8.1.1  添加实体 166

8.1.2  更新实体 167

8.1.3  删除实体 168

8.1.4  订阅保存事件和注册保存拦截器 169

8.2  保存相关实体 170

8.2.1  同时添加多个相关实体 170

8.2.2  为主实体单独添加从实体 171

8.2.3  更改实体的关系 172

8.2.4  删除关系 173

8.3  并发冲突 174

8.4  事务 175

8.4.1  简单事务 175

8.4.2  跨上下文事务 176

8.4.3  使用外部事务 177

8.4.4  保存点 178

8.5  异步保存 178

8.6  实体跟踪器和实体追踪图 179

8.6.1  基础使用 179

8.6.2  订阅实体跟踪事件 180

8.7  小结 180

第9章  查询数据 181

9.1  基础查询 181

9.1.1  查询数据集合 181

9.1.2  查询单个数据 182

9.1.3  查询标量值 183

9.1.4  引用影子属性 183

9.1.5  查询标记 184

9.2  复杂查询 184

9.2.1  结果投影 184

9.2.2  连接查询 185

9.2.3  分组查询 187

9.2.4  临时禁用全局查询过滤器 188

9.3  原始SQL查询 188

9.4  映射的自定义函数 189

9.4.1  使用标量值函数 189

9.4.2  使用表值函数和存储过程 189

9.4.3  自定义方法转换 190

9.5  加载相关数据 191

9.5.1  预加载 191

9.5.2  延迟加载 192

9.5.3  显式加载 195

9.5.4  拆分查询 195

9.6  跟踪和非跟踪查询 196

9.7  显式编译查询 197

9.8  查看生成的SQL语句 197

9.9  服务端查询和客户端查询 198

9.10  命令拦截器 198

9.11  异步查询 199

9.12  小结 199

第10章  Entity Framework Core共享功能 200

10.1  配置上下文 200

10.1.1  日志记录 200

10.1.2  参数显示 201

10.1.3  全局默认拆分查询 201

10.1.4  全局默认基于标识解析的非跟踪查询 201

10.2  自动重试 201

10.3  内存数据库 202

10.4  小结 202

第三篇  ASP.NET Core

第11章  快速入门 205

11.1  简介 205

11.2  创建项目 205

11.3  小结 208

第12章  公共基础 209

12.1  依赖注入 209

12.1.1  概述 209

12.1.2  在控制台应用中使用依赖注入 210

12.1.3  在ASP.NET Core应用中使用依赖注入 214

12.1.4  EF Core中的依赖注入 216

12.1.5  面向切面编程 216

12.2  配置 223

12.2.1  简介 223

12.2.2  在控制台应用中使用配置 224

12.2.3  在ASP.NET Core应用中使用配置 224

12.3  选项 226

12.3.1  简介 226

12.3.2  具名选项 226

12.3.3  数据变更同步和变更事件 226

12.3.4  后期处理 226

12.3.5  选项验证 226

12.3.6  选项作用域 227

12.3.7  在控制台应用中使用选项 227

12.3.8  在ASP.NET Core应用中使用选项 232

12.3.9  利用依赖注入的选项 233

12.4  日志 234

12.4.1  日志类别 235

12.4.2  严重性级别 235

12.4.3  事件Id 235

12.4.4  消息模板 236

12.4.5  记录异常 236

12.4.6  作用域 236

12.4.7  运行时更改过滤器级别 236

12.4.8  在简单控制台应用中使用日志 236

12.4.9  记录提供程序 237

12.5  主机 238

12.5.1  托管服务 238

12.5.2  环境 240

12.5.3  通用主机 240

12.6  Web主机 243

12.6.1  托管到Windows服务和Linux服务 243

12.6.2  .NET后台服务 244

12.7  中间件和请求处理管道 245

12.7.1  中间件和请求处理管道的关系 245

12.7.2  终端中间件和管道短路 246

12.7.3  中间件的顺序 247

12.7.4  管道分支 248

12.7.5  内置中间件 249

12.7.6  自定义中间件 251

12.8  Startup类 254

12.8.1  基础使用 254

12.8.2  多环境Startup 255

12.8.3  Startup过滤器 256

12.8.4  .NET 6新增的最小配置API 258

12.9  静态文件 258

12.9.1  基础使用 258

12.9.2  浏览 259

12.9.3  静态文件授权 260

12.10  动态响应和静态资源压缩 260

12.10.1  动态响应压缩 260

12.10.2  静态资源压缩 261

12.11  缓存 261

12.11.1  客户端缓存 261

12.11.2  缓存服务和响应缓存中间件 262

12.11.3  页面数据缓存 264

12.12  流量控制 264

12.12.1  请求频率控制 264

12.12.2  响应发送速率控制 264

12.13  端点路由 279

12.13.1  传统路由回顾 279

12.13.2  端点路由简介 279

12.13.3  基础使用 280

12.13.4  链接生成 280

12.13.5  路由模板 281

12.13.6  路由约束 281

12.13.7  自定义约束 282

12.13.8  参数转换器 283

12.13.9  自定义端点 284

12.14  发送HTTP请求 289

12.14.1  基础使用 290

12.14.2  请求中间件 293

12.14.3  基于策略的处理程序和弹性故障处理 295

12.14.4  请求标头传播和分布式链路追踪 297

12.14.5  管理和使用Cookie 298

12.15  错误处理 299

12.16  托管和部署 301

12.17  小结 303

第13章  身份认证 304

13.1  基础身份认证 304

13.1.1  Cookie认证 304

13.1.2  JWT认证 308

13.1.3  自定义身份认证 313

13.1.4  接入第三方身份认证服务 314

13.2  ASP.NET Core Identity 318

13.2.1  基础使用 319

13.2.2  自定义用户数据 321

13.2.3  账户确认和密码重置 322

13.2.4  双因素身份验证和二维码生成 323

13.2.5  隐私数据保护 323

13.3  OpenIddict 329

13.3.1  OpenId Connect(OIDC)和OAuth协议简介 329

13.3.2  OpenIddict简介 332

13.3.3  基础使用 332

13.4  小结 340

第14章  授权 341

14.1  定义授权策略 341

14.2  配置授权策略 343

14.3  高级功能简介 345

14.3.1  授权策略提供程序 345

14.3.2  自定义授权结果的处理方式 345

14.4  小结 345

第15章  MVC 346

15.1  简介 346

15.1.1  MVC模式 346

15.1.2  ASP.NET Core MVC 347

15.2  模型 347

15.2.1  基础使用 347

15.2.2  自定义数据源 350

15.2.3  特殊数据类型 350

15.2.4  从模型绑定中排除特定类型 350

15.2.5  模型绑定的全球化 350

15.2.6  手动调用模型绑定 351

15.2.7  输入格式化器 351

15.2.8  为输入格式化器自定义特定类型的转换器 352

15.2.9  自定义模型绑定 352

15.2.10  模型验证 355

15.3  控制器和动作 359

15.3.1  基础使用 359

15.3.2  控制器和动作中的依赖注入 360

15.3.3  IActionResult 361

15.4  MVC过滤器 362

15.4.1  简介 362

15.4.2  授权过滤器 364

15.4.3  自定义过滤器 364

15.4.4  依赖注入 366

15.4.5  配置过滤器 367

15.5  视图 368

15.5.1  Razor引擎简介 368

15.5.2  基础Razor语法 368

15.5.3  特殊Razor文件 373

15.5.4  标签助手 374

15.5.5  视图组件 378

15.5.6  客户端模型验证 381

15.5.7  运行时视图编译 386

15.5.8  视图编码 386

15.5.9  视图发现 387

15.6  区域 388

15.7  MVC路由 389

15.7.1  传统路由 389

15.7.2  特性路由 390

15.7.3  路由参数转换器 391

15.8  应用程序模型 391

15.9  应用程序部件 392

15.10  小结 393

第16章  Razor Pages 394

16.1  简介 394

16.2  基础使用 395

16.3  页面处理器 396

16.3.1  默认约定 396

16.3.2  相关的Razor指令 397

16.3.3  后台代码 398

16.4  模型绑定 398

16.5  Razor Pages过滤器 399

16.5.1  全局配置 399

16.5.2  重写基类的方法 400

16.5.3  特性配置 400

16.6  Razor Pages路由 400

16.7  小结 401

第17章  Blazor 402

17.1  简介 402

17.2  公共基础 403

17.2.1  依赖注入 403

17.2.2  配置 404

17.2.3  启动 405

17.2.4  环境 407

17.2.5  路由 408

17.2.6  错误处理 408

17.3  Razor组件 410

17.3.1  相关的Razor指令 410

17.3.2  后台代码和分部类支持 411

17.3.3  输出原始HTML 412

17.3.4  依赖注入 412

17.3.5  路由和导航 413

17.3.6  组件参数 414

17.3.7  属性展开和任意参数 414

17.3.8  子内容 415

17.3.9  组件和元素引用 416

17.3.10  使用@key控制是否保留元素和组件 416

17.3.11  Razor模板 417

17.3.12  模板化组件 417

17.3.13  级联值和参数 419

17.3.14  数据绑定 421

17.3.15  事件处理 423

17.3.16  生命周期 425

17.3.17  组件渲染 427

17.3.18  虚拟滚动组件 428

17.3.19  动态组件 429

17.3.20  表单和验证 429

17.3.21  CSS隔离 429

17.3.22  常用内置组件简介 430

17.4  服务端预渲染 431

17.4.1  基础使用 431

17.4.2  保持组件状态 434

17.5  布局 437

17.6  发送HTTP请求 437

17.7  JavaScript互操作 437

17.7.1  从.NET调用JavaScript 438

17.7.2  从JavaScript调用.NET 439

17.8  状态管理 442

17.9  程序集延迟加载 443

17.9.1  基础使用 443

17.9.2  延迟加载的程序集中的可路由组件 444

17.10  渐进式Web应用 445

17.10.1  简介 445

17.10.2  启用PWA支持 445

17.11  调试 447

17.11.1  准备工作 447

17.11.2  启用调试 448

17.11.3  在浏览器中调试 448

17.12  托管和部署 450

17.12.1  常用发布选项 450

17.12.2  关于应用基地址和在同一个服务端同时托管多个应用的注意事项 451

17.12.3  AOT编译、IL裁剪和引用Native代码功能简介 462

17.13  小结 463

第18章  Razor类库 464

18.1  简介 464

18.2  静态资源组织 464

18.3  小结 465

第19章  Web API 466

19.1  基础使用 466

19.1.1  默认约定的API控制器 466

19.1.2  Web API路由 468

19.1.3  模型绑定 468

19.2  API版本、Open API和Swagger 469

19.2.1  多版本API 470

19.2.2  Swashbuckle 471

19.3  小结 473

第20章  远程过程调用 474

20.1  WCF回顾 474

20.2  gRPC 475

20.2.1  PROTO文件 475

20.2.2  服务端 475

20.2.3  客户端 478

20.2.4  在Blazor WebAssembly应用中使用gRPC-Web客户端 480

20.3  小结 481

第21章  实时通信 482

21.1  早期解决方案回顾 482

21.2  WebSocket简介 482

21.3  SignalR 483

21.3.1  集线器 483

21.3.2  流式连接 490

21.3.3  消息格式协议 492

21.3.4  应用承载力扩展 492

21.3.5  客户端 493

21.4  小结 507

第22章  应用安全 508

22.1  数据保护 508

22.1.1  基础使用 508

22.1.2  层次结构 510

22.1.3  时效性数据保护 510

22.2  管理机密 510

22.3  欧盟通用数据保护条例(GDPR) 511

22.4  防御恶意攻击 512

22.4.1  跨站点请求伪造(XSRF/CSRF) 513

22.4.2  开放重定向攻击 514

22.4.3  跨站点脚本攻击(XSS) 514

22.5  一般安全功能 515

22.5.1  强制执行HTTPS 515

22.5.2  HTTP严格传输安全协议(HSTS) 515

22.5.3  HTTPS和响应压缩 516

22.5.4  跨域资源共享(CORS) 516

22.5.5  内容安全策略(CSP) 517

22.5.6  跨应用共享Cookie 517

22.6  小结 517

第23章  高级功能 518

23.1  全球化和本地化 518

23.1.1  服务注册和请求管道配置 518

23.1.2  准备本地化文本 519

23.1.3  使用本地化服务 520

23.1.4  准备语言设置界面 522

23.2  GraphQL 523

23.2.1  服务端 523

23.2.2  客户端 562

23.3  Elsa 565

23.3.1  基础概念 565

23.3.2  搭建Web服务器 566

23.3.3  简单自动工作流 568

23.3.4  人机交互工作流 569

23.4  MiniProfiler 572

23.5  小结 573

第24章  其他.NET功能 574

24.1  C/C++互操作 574

24.1.1  CppSharp简介 574

24.1.2  基础使用 575

24.2  程序集的动态载入和卸载 578

24.3  小结 580

第四篇  实战演练

第25章  电子商城项目 583

25.1  项目定位 583

25.2  需求分析 584

25.2.1  统一的身份认证和授权中心 584

25.2.2  买家的独立网页渲染和业务逻辑服务 584

25.2.3  卖家的店铺、商品和订单管理 584

25.3  架构设计 585

25.4  创建解决方案和Git存储库 586

25.4.1  创建解决方案 586

25.4.2  创建Git存储库 587

25.5  定义应用域的通用抽象接口 588

25.5.1  实体相关接口 588

25.5.2  仓储相关接口 591

25.5.3  命令和事件相关接口 596

25.6  开发通用基础设施 601

25.6.1  EF Core仓储 601

25.6.2  MediatR总线 605

25.7  开发身份认证和授权中心 608

25.7.1  EF Core扩展 608

25.7.2  Identity实体和上下文 609

25.7.3  集成Identity到ASP.NET Core托管网站 621

25.7.4  集成第三方账号登录 624

25.7.5  增加角色管理功能 625

25.7.6  添加OpenIddict服务端组件 627

25.8  开发买家商城 633

25.8.1  商城服务实体 633

25.8.2  商城服务 642

25.8.3  商城服务API站点 646

25.8.4  商城网站的初步开发 660

25.8.5  订单服务 671

25.8.6  订单服务API站点 674

25.8.7  商城网站的购物业务 676

25.9  开发卖家管理中心 681

25.9.1  卖家API 681

25.9.2  卖家管理应用 700

25.10  小结 723

作者简介

编辑推荐

"融合.NET基础知识、核心技术与项目实现,除使用C#代码外,还结合C++、Java代码进行对比演示,熟悉其中任何一种语言的读者都可以轻松上手

涉及众多现代Web流行技术,包括交互式Web UI框架Blazor、数据访问技术GraphQL、.NET互操作代码的编写等"

作者寄语

敖瑞,网络工程专业,中级软件设计师,从业5年,资深软件工程师,主要从事系统开发,精通C# .NET开发,同时熟悉JavaScript和Web前端开发。在国内开发者论坛分享学习思考心得,参与开源社区项目的完善。

电子资料

www.luweidong.cn

下一个