图书目录

                                              

     

     

     

     

     

     

第  1 章  初始化     ASP.NET Core   应用程序     . 1 

    1.1  应用程序的启动过程         ..1 

    1.2  WebApplicationBuilder 类 ..2 

    1.3  启动应用程序.3 

    1.4  使用  Host 初始化应用程序      4 

        1.4.1  通用主机    5 

        1.4.2  示例:简单的通用主机         .5 

        1.4.3  Web 主机  7 

    1.5  设置应用程序的       URL..9 

        1.5.1  调用  UseUrls()方法 .9 

        1.5.2  使用  WebApplication 类的 Urls 属性 .. 10 

        1.5.3  调用  Run()方法时传递     URL .. 10 

        1.5.4  通过  ServerAddressesFeature 对象设置 URL  11 

        1.5.5  使用命令行参数       12 

        1.5.6  使用配置文件. 13 

        1.5.7  使用环境变量. 13 

        1.5.8  使用  launchSettings.json 文件 14 

        1.5.9  Kestrel 服务器的侦听地址     . 14 

        1.5.10  通过  HTTP.sys 配置 URL . 15 

        1.5.11  PreferHostingUrls()方法的作用 .. 15 

    1.6  应用程序生命周期事件          16 

第  2 章  运行环境. 18 

    2.1  定义运行环境.. 18 

    2.2  Is{EnvironmentName}扩展方法   . 19 

    2.3  多运行环境下的配置文件 21 

    2.4  用于环境筛选的       Razor 标记 23 

    2.5  运行环境与依赖注入          25 

第  3 章  依赖注入. 28 

    3.1  依赖注入与服务容器          28 

        3.1.1  ServiceCollection 类 . 31 

     IV      深入浅出:ASP.NET Core 

              3.1.2  ServiceProvider 类  32 

          3.2  .NET 项目中的依赖注入.. 32 

          3.3  ASP.NET Core 项目中的依赖注入. 33 

          3.4  构建存在依赖关系的服务 35 

          3.5  服务的生存期.. 38 

          3.6  GetService()方法与 GetRequiredService()方法的区别. 41 

          3.7  注入多个服务实例. 42 

          3.8  容易被忽略的问题. 46 

      第  4 章  配置应用程序         48 

          4.1  配置的基本结构       . 48 

          4.2  在.NET 应用程序中使用配置         . 49 

          4.3  在 ASP.NET Core 应用程序中使用配置        .. 51 

              4.3.1  配置的数据来源       51 

              4.3.2  查看所有配置信息 51 

          4.4  IConfigurationBuilder 接口.. 52 

          4.5  ConfigurationManager 类 . 53 

          4.6  IConfigurationSource 接口与 IConfigurationProvider 接口  54 

              4.6.1  自定义扩展点. 55 

              4.6.2  示例:来自     CSV 文件的配置      56 

          4.7  JSON 配置   59 

              4.7.1  示例:访问     JSON 数组对象.. 62 

              4.7.2  示例:自动重新加载配置.. 63 

          4.8  XML 配置  . 64 

          4.9  环境变量    .. 67 

              4.9.1  设置环境变量前缀 68 

              4.9.2  替换默认的     ASPNETCORE_前缀     70 

              4.9.3  示例:替换环境变量前缀.. 70 

              4.9.4  分层配置结构. 71 

          4.10  命令行参数      72 

          4.11  ini 配置  75 

          4.12  配置与依赖注入 78 

              4.12.1  示例:将    IConfiguration 注入 MVC 控制器 78 

              4.12.2  示例:通过配置选择哈希算法            .. 79 

          4.13  链接多棵配置树 82 

      第  5 章  选项模式. 85 

          5.1  选项模式概述.. 85 

                                                                                           目录        V 

    5.2  服务容器的扩展方法          87 

    5.3  各接口之间的关系. 87 

        5.3.1  IConfigureOptions<TOptions>接口与 IConfigureNamedOptions<TOptions>接口 .. 87 

        5.3.2  IPostConfigureOptions<TOptions>接口 .. 88 

        5.3.3  IValidateOptions<TOptions>接口 . 88 

        5.3.4  IOptionsFactory<TOptions>接口 .. 89 

        5.3.5  完整的流程图. 90 

    5.4  选项类的封装接口. 91 

        5.4.1  示例:在    MVC 控制器中访问选项类. 92 

        5.4.2  示例:自动更新选项类         .. 93 

    5.5  带名称的选项组       . 95 

    5.6  后期配置    .. 98 

    5.7  选项类的验证.. 99 

        5.7.1  内置的验证方式      . 100 

        5.7.2  使用数据批注.. 102 

    5.8  处理带参数的构造函数         . 105 

    5.9  直接实现    IOptions 接口 . 108 

第  6 章  HTTP   管道   110 

    6.1  HTTP 管道与中间件      .. 110 

    6.2  中间件的实现方法.. 110 

    6.3  通过委托实现中间件         ..111 

        6.3.1  示例:Use()方法的简单用法.. 114 

        6.3.2  HTTP 管道的“短路”       . 115 

        6.3.3  Run()方法 . 116 

    6.4  通过类实现中间件.. 117 

        6.4.1  带参数的中间件      . 118 

        6.4.2  中间件类与依赖注入         119 

    6.5  通过  IMiddleware 接口实现中间件       120 

    6.6  终结点. 121 

        6.6.1  示例:常见的     HTTP  请求方式    .. 123 

        6.6.2  示例:同时使用      Razor Pages 和 MVC . 125 

        6.6.3  为终结点分配名称. 127 

        6.6.4  元数据 129 

    6.7  有条件地执行中间件         . 130 

        6.7.1  示例:调用包含      user_id 字段的中间件     .. 131 

        6.7.2  示例:只允许以      POST  方式调用    Web API . 132 

     VI      深入浅出:ASP.NET Core 

      第  7 章  HTTP   状态存储     ..135 

          7.1  HTTP 上下文. 135 

              7.1.1  示例:在中间件中设置响应标头.. 136 

              7.1.2  示例:在    Map*()方法中访问     HTTP 上下文   .. 137 

              7.1.3  示例:使用     Razor 标记呈现   HTTP 请求标头      138 

              7.1.4  示例:在    MVC 中访问    HTTP 上下文   .. 140 

          7.2  HTTP 消息头. 141 

              7.2.1  HeaderNames 类.. 143 

              7.2.2  消息头的分类.. 144 

              7.2.3  分析复杂消息头      . 145 

          7.3  查询字符串     148 

              7.3.1  读取查询参数.. 149 

              7.3.2  多值参数    .. 150 

          7.4  表单数据     151 

              7.4.1  读取简单的表单数据         151 

              7.4.2  文件上传    .. 153 

          7.5  Cookie . 157 

          7.6  HttpContext 类的 Items 属性  159 

          7.7  会话  . 160 

              7.7.1  ISession 接口 161 

              7.7.2  设置会话    Cookie 的名称.. 164 

              7.7.3  示例:将会话数据存储到          JSON 文件中    . 164 

      第  8 章  Razor页面172 

          8.1  Razor 页面的特点     172 

          8.2  Razor 语法 . 173 

              8.2.1  两种表达式    .. 173 

              8.2.2  代码块 174 

              8.2.3  注释  175 

              8.2.4  流程控制    .. 176 

          8.3  开启  Razor 页面功能.. 177 

          8.4  Razor 页面文件    178 

          8.5  页面文件的搜索路径         . 179 

              8.5.1  配置  RazorPagesOptions 选项类  180 

              8.5.2  便捷的扩展方法      . 180 

          8.6  页面路由     181 

              8.6.1  通过@page  指令设置路由规则.. 181 

                                                                                           目录        VII

        8.6.2  通过约定模型定义路由规则           .. 182 

    8.7  页面模型类     184 

        8.7.1  页面自身作为模型类         185 

        8.7.2  从 PageModel 派生类   185 

        8.7.3  通过特性类实现页面模型类           .. 186 

    8.8  页面处理程序 187 

        8.8.1  通用的处理程序      . 188 

        8.8.2  解决  POST 请求时出现的错误        .. 189 

        8.8.3  使用多个处理程序. 190 

        8.8.4  通过路由参数选择处理程序           .. 192 

        8.8.5  自定义的处理程序模型          193 

第  9 章  MVC框架      .199 

    9.1  MVC 基本概念    . 199 

    9.2  启用  MVC  功能   199 

    9.3  控制器. 200 

        9.3.1  示例:从    ControllerBase 类派生 203 

        9.3.2  示例:从    Controller 类派生  205 

        9.3.3  示例:使用     ControllerAttribute.. 205 

        9.3.4  示例:使用     Controller 后缀  206 

        9.3.5  自定义控制器的名称         207 

        9.3.6  示例:ControllerNameAttribute 类  207 

        9.3.7  自定义操作方法的名称          208 

        9.3.8  示例:CustActionNameAttribute 类 .. 208 

        9.3.9  示例:ActionNameAttribute 类 .. 209 

    9.4  MVC 路由规则    . 210 

        9.4.1  全局路由规则.. 211 

        9.4.2  示例:注册两条全局路由规则            .. 211 

        9.4.3  局部路由规则.. 212 

        9.4.4  IRouteTemplateProvider 接口.. 213 

        9.4.5  通过实现约定接口定义路由规则.. 214 

        9.4.6  示例:CustPrefixRouteConvention 类 .. 215 

    9.5  限制操作方法所支持的         HTTP  请求  .. 217 

        9.5.1  示例:只支持     HTTP-PUT  请求的操作方法 217 

        9.5.2  内置特性类    .. 218 

    9.6  区域  . 220 

    9.7  视图  . 221 

     VIII     深入浅出:ASP.NET Core 

               9.7.1  视图文件的默认存放路径 221 

               9.7.2  自定义视图的路径格式          222 

               9.7.3  布局视图    .. 225 

               9.7.4  示例:布局视图的查找顺序           .. 226 

               9.7.5  示例:配置     Razor Pages 布局视图的查找路径       . 229 

               9.7.6  _ViewImports 与_ViewStart 文件 .. 231 

               9.7.7  示例:_ViewStart 文件的替换行为       .. 232 

           9.8  IViewLocationExpander 接口 233 

               9.8.1  示例:多版本视图. 234 

               9.8.2  示例:根据     URL 查询参数扩展视图路径          .. 237 

               9.8.3  LanguageViewLocationExpander 类 .. 240 

           9.9  局部视图     242 

               9.9.1  示例:成绩单.. 243 

               9.9.2  示例:导航栏.. 246 

           9.10  视图组件.. 248 

                9.10.1  示例:一个简单的视图组件.. 249 

                9.10.2  视图文件的查找路径 250 

                9.10.3  示例:带参数的视图组件          .. 251 

                9.10.4  通过标记帮助器调用视图组件            . 253 

                9.10.5  示例:Greeting  视图组件 254 

                9.10.6  示例:在    MVC 控制器中调用视图组件          . 255 

                9.10.7  两个特性类     . 255 

           9.11  识别其他程序集中的控制器.. 256 

                9.11.1  示例:使用     ApplicationPartAttribute 类 . 256 

                9.11.2  示例:使用     AddApplicationPart()扩展方法 .. 257 

                9.11.3  示例:使用     ApplicationPartManager 类 .. 259 

       第  10 章  模型绑定      .261 

           10.1  概述  .. 261 

           10.2  自动绑定   .. 262 

                 10.2.1  示例:计算器. 263 

                 10.2.2  示例:绑定数组类型的数据.. 264 

                 10.2.3  示例:绑定复杂类       266 

                 10.2.4  多个参数的模型绑定        268 

                 10.2.5  示例:绑定    3 个参数 268 

                 10.2.6  字典类型的模型绑定        270 

                 10.2.7  示例:绑定字典数据 270 

                                                                                            目录        IX

          10.2.8  示例:绑定    IFormCollection 类型  272 

          10.2.9  示例:MD5   计算器   .. 273 

          10.2.10  绑定 IFormFile 和 IFormFileCollection 类型 .. 274 

          10.2.11  示例:上传一个文本文件          275 

          10.2.12  示例:上传多个文件       . 276 

    10.3  设置模型绑定的来源 278 

          10.3.1  示例:绑定    HTTP 消息头   .. 278 

          10.3.2  示例:从   HTTP 消息正文提取数据. 279 

          10.3.3  示例:与路由参数绑定        .. 280 

          10.3.4  示例:FromServices 特性的使用     . 280 

          10.3.5  示例:混合使用      From*特性类   . 282 

          10.3.6  示例:将   From*特性类应用于属性成员           283 

    10.4  自定义   IValueProvider 接口 284 

          10.4.1  示例:由自定义字符串提供的值. 285 

          10.4.2  示例:CookieValueProvider 288 

    10.5  IModelBinder 接口  292 

          10.5.1  内置绑定器    . 293 

          10.5.2  示例:AddressInfoModelBinder 类 .. 294 

    10.6  BindRequiredAttribute 类与 BindNeverAttribute 类 . 296 

    10.7  绑定到属性成员. 299 

          10.7.1  示例:控制器的属性绑定         .. 299 

          10.7.2  示例:PageModel  中的属性绑定      . 300 

          10.7.3  示例:CancellationToken 类型的属性绑定       302 

第  11 章  Web API   .305 

    11.1  Web API 基础 . 305 

          11.1.1  ControllerBase 类与 Controller 类 . 305 

          11.1.2  ApiController 特性  306 

          11.1.3  示例:一个简单的       Web API .. 306 

          11.1.4  示例:以   POST 方式提交数据.. 308 

    11.2  XML 格式   310 

          11.2.1  示例:常规的     XML 序列化方案     .. 311 

          11.2.2  示例:使用    XmlDataContractSerializer 方案  314 

    11.3  选择响应格式     . 316 

          11.3.1  示例:通过    Accept 消息头选择响应格式.. 316 

          11.3.2  示例:使用格式过滤器        .. 317 

    11.4  自定义格式     . 319 

     X       深入浅出:ASP.NET Core 

                11.4.1  示例:CustDataInputFormatter 类  319 

                11.4.2  示例:BytesToHexOutputFormatter 类  323 

          11.5  极小  API .. 325 

                11.5.1  示例:一些简单的极小        API 例子. 325 

                11.5.2  示例:在极小     API 上使用数据源特性 327 

                11.5.3  上传文件.. 328 

                11.5.4  示例:直接读取文件流        .. 328 

                11.5.5  示例:上传多个文件 330 

                11.5.6  IResult 接口. 332 

                11.5.7  示例:Results 类的使用.. 333 

          11.6  API 浏览功能   . 333 

                11.6.1  IApiDescriptionGroupCollectionProvider 接口.. 334 

                11.6.2  示例:列出已定义的        Web API.. 334 

                11.6.3  API 约定 .. 337 

                11.6.4  Swagger 框架.. 339 

                11.6.5  示例:使用    Swagger 生成 API 文档   340 

      第  12 章  过滤器     .343 

          12.1  过滤器的执行过程        343 

                12.1.1  示例:观察过滤器的运行顺序           . 344 

                12.1.2  示例:同时实现多个接口.. 348 

          12.2  过滤器的作用域. 349 

                12.2.1  示例:全局过滤器       349 

                12.2.2  示例:特性化的过滤器        .. 350 

          12.3  在 Razor Pages 中使用过滤器     352 

                12.3.1  示例:在   Razor 标记页和页面模型类上应用过滤器              . 352 

                12.3.2  示例:在   Razor Pages 中应用全局过滤器      . 353 

                12.3.3  页面处理程序的过滤器        .. 354 

                12.3.4  示例:实现    IPageFilter 接口 . 354 

          12.4  异步过滤器接口. 355 

                12.4.1  示例:实现异步授权过滤器.. 356 

                12.4.2  示例:实现异步资源过滤器.. 356 

          12.5  IAlwaysRunResultFilter 接口 . 358 

          12.6  IFilterFactory 接口  360 

                12.6.1  示例:访问服务容器中的过滤器            . 360 

                12.6.2  示例:使用    TypeFilterAttribute 类创建过滤器实例 361 

                12.6.3  示例:使用    ServiceFilterAttribute 类访问服务容器中的过滤器      . 363 

                                                                                           目录        XI

    12.7  过滤器的运行顺序        364 

          12.7.1  示例:过滤器的作用域与运行顺序              364 

          12.7.2  示例:自定义过滤器的运行顺序            . 368 

    12.8  抽象的过滤器特性类 369 

          12.8.1  示例:重写    ActionFilterAttribute 类  370 

          12.8.2  示例:重写    ExceptionFilterAttribute 类 . 371 

第  13 章  标记帮助器.372 

    13.1  标记帮助器简介. 372 

          13.1.1  示例:为<span>标记添加“加粗”功能 373 

          13.1.2  示例:<url>标记帮助器      . 374 

          13.1.3  示例:使用标记帮助器设置          HTML  元素的文本样式        375 

    13.2  将标记帮助器注册到服务容器            . 377 

    13.3  内置的标记帮助器        380 

          13.3.1  示例:缓存当前时间 380 

          13.3.2  示例:用<button>元素提交表单.. 381 

          13.3.3  示例:asp-for 属性的使用     . 382 

          13.3.4  示例:呈现验证信息 384 

    13.4  标记帮助器组件. 386 

          13.4.1  示例:在<body>元素内插入        CSS 样式  .. 387 

          13.4.2  示例:使用    ITagHelperComponentManager 对象注册标记帮助器组件          389 

第  14 章  静态文件      .392 

    14.1  静态文件简介     . 392 

    14.2  使用静态文件. 393 

          14.2.1  示例:访问图像文件 393 

          14.2.2  示例:修改    WEBROOT   路径   395 

          14.2.3  示例:统计输入的字符数量.. 397 

          14.2.4  示例:合并多个目录        398 

    14.3  目录浏览.. 400 

          14.3.1  示例:浏览外部目录        401 

          14.3.2  示例:自定义文件类型映射.. 401 

    14.4  文件服务.. 410 

第  15 章  路由约束      .412 

    15.1  路由约束的作用. 412 

    15.2  IRouteConstraint 接口 .. 412 

    15.3  内置的路由约束. 413 

          15.3.1  示例:双精度数值约束        .. 415 

     XII     深入浅出:ASP.NET Core 

                15.3.2  示例:限制字符串长度        .. 415 

                15.3.3  示例:特定格式的订单号         .. 416 

                15.3.4  示例:限制整数值的范围.. 417 

          15.4  自定义路由约束. 417 

      第  16 章  SignalR419 

          16.1  WebSocket 419 

                16.1.1  示例:用   JavaScript 实现客户端.. 419 

                16.1.2  示例:用.NET   控制台实现     WebSocket 客户端    422 

                16.1.3  子协议.. 424 

          16.2  SignalR 基础 427 

                16.2.1  SignalR 中心 .. 428 

                16.2.2  示例:简易计算器       428 

                16.2.3  示例:使用面向.NET      的 SignalR 库  430 

          16.3  调用客户端     . 433 

                16.3.1  示例:聊天室. 433 

                16.3.2  将客户端定义为接口 435 

                16.3.3  示例:实时更新进度条        .. 436 

                16.3.4  示例:记录连接状态 438 

      第  17 章  Blazor..442 

          17.1  Blazor 概述 . 442 

          17.2  服务器托管     . 443 

                17.2.1  示例:使用    Razor Pages 承载 Blazor 应用  444 

                17.2.2  示例:在   MVC  视图中承载     Blazor 应用  446 

                17.2.3  初始化脚本    . 448 

                17.2.4  示例:使用初始化脚本        .. 449 

                17.2.5  示例:手动添加      modules.json 文件. 450 

          17.3  WebAssembly 托管  451 

                17.3.1  示例:手动创建      Blazor WebAssembly 项目.. 452 

                17.3.2  示例:用   node.js 开发 Blazor WebAssembly 服务器 .. 454 

                17.3.3  示例:初始化脚本       457 

                17.3.4  DevServer  458 

          17.4  路由组件.. 459 

                17.4.1  示例:路由组件的简单应用.. 460 

                17.4.2  示例:使用路由参数 461 

                17.4.3  示例:使用[Route]特性    .. 463 

          17.5  布局组件.. 463 

                                                                                           目录        XIII

          17.5.1  示例:导航栏. 464 

          17.5.2  示例:将普通组件用于布局.. 466 

    17.6  组件参数.. 466 

          17.6.1  示例:嵌套组件的参数传递.. 466 

          17.6.2  示例:顶层组件的参数传递(Blazor Server)           467 

          17.6.3  示例:顶层组件的参数传递(Blazor WebAssembly)           . 468 

    17.7  级联参数.. 469 

          17.7.1  示例:根据类型接收级联参数           . 469 

          17.7.2  示例:根据命名接收级联参数           . 472 

    17.8  事件  .. 473 

          17.8.1  示例:计数器. 476 

          17.8.2  示例:记录鼠标指针的位置.. 476 

          17.8.3  EventCallback 结构体 .. 477 

          17.8.4  示例:进度条组件       478 

    17.9  CSS 隔离.. 480 

    17.10  数据绑定    482 

          17.10.1  示例:绑定日期输入元素          .. 483 

          17.10.2  示例:使用     oninput 事件  483 

          17.10.3  组件之间的绑定       484 

          17.10.4  示例:Slider 组件. 485 

    17.11  用.NET 代码编写组件 486 

          17.11.1  渲染树  .. 487 

          17.11.2  示例:用.NET    代码实现    App 和 Index 组件. 488 

          17.11.3  示例:使用依赖注入 491 

    17.12  .NET 与 JavaScript 互操作 493 

          17.12.1  示例:调用     JavaScript 中的 alert()方法 . 494 

          17.12.2  示例:调用     QRCode.js 生成二维码. 494 

          17.12.3  示例:阶乘计算器 496 

          17.12.4  示例:JavaScript 调用.NET   对象的实例方法       .. 497 

第  18 章  验证与授权.500 

    18.1  验证与授权的关系        500 

    18.2  与验证有关的核心服务          .. 501 

    18.3  验证处理程序. 501 

         18.3.1  示例:验证    HTTP  消息头 502 

         18.3.2  示例:多个验证方案共用一个            IAuthenticationHandler 接口 505 

    18.4  IAuthenticationSignInHandler 接口 .. 508 

     XIV      深入浅出:ASP.NET Core 

           18.5  验证中间件     . 515 

           18.6  授权处理程序与必要条件          .. 519 

                18.6.1  示例:允许指定的部门访问           .. 520 

                18.6.2  PassThroughAuthorizationHandler 类 522 

           18.7  授权策略   .. 525 

                18.7.1  示例:按用户星级授权 525 

                18.7.2  示例:集成内置的       Cookie 验证   529 

                18.7.3  示例:在终结点上应用授权策略             . 534