二十一、答案

第一章

  1. 依赖注入有什么好处?

它允许更好地分离接口和实际实现,并允许我们随时更改实现。它还递归地注入所有必需的依赖项。

  1. 什么是环境?

一组命名的启动值。

  1. MVC 是什么意思?

Easy peasy:模型视图控制器!

  1. 内置依赖注入容器中支持的生存期是多少?

Transient(每次创建一个新实例)、Scoped(每次 HTTP 请求都创建一个新实例并始终返回)、Singleton(创建一个实例)。

  1. .NET Core 与.NET 标准有什么区别?

.NET 标准只是由.NET 和.NET Core 等实现的一组标准 API。

  1. 什么是元包?

由 Microsoft 定义的一组软件包。它包含简单 ASP.NET Core 项目通常需要的所有包。

  1. OWIN 是什么?

OWIN 代表为.NET开放的 Web 界面,您可以在上阅读 http://owin.org 。本质上,它是一种将 web 应用与特定服务器(如 IIS)分离的规范。

第二章

  1. 检索配置值的根接口是什么?

IConfiguration。这是IConfigurationRootIConfigurationSection继承的地方。

  1. 什么是.NET Core 中内置的基于文件的配置提供程序?

JSON、XML 和 INI。

  1. 是否可以将配置绑定到开箱即用的 POCO 类?

是的,但是我们需要添加Microsoft.Extensions.Configuration.BinderNuGet 包。

  1. IOptions<T>IOptionsSnapshot<T>接口之间有什么区别?

IOptionsSnapshot<T>在基础配置更改时更新(如果我们为此进行了配置),但IOptions<T>始终保留原始配置值。

  1. 我们是否需要在依赖项注入容器中显式注册配置对象?

否。从 ASP.NET Core 2.0 开始,IConfiguration自动注入。

  1. 我们如何拥有可选的配置文件?

注册基于文件的配置文件时,将optional参数设置为true

  1. 当配置发生变化时,是否可以获得通知?

对我们需要获得一个重新加载令牌,然后在其中注册一个更改回调委托。

第三章

  1. 什么是特殊路线代币?

[controller][action][area]

  1. 我们如何防止根据请求的 HTTP 谓词选择路由?

[HttpPost][HttpGet][HttpPut]或其他 HTTP 属性之一应用于其操作方法。

  1. 除非请求使用 HTTPS,否则如何防止路由被选择?

[RequireHttps]属性应用于路由的操作方法。

  1. 我们如何根据发生的 HTTP 错误代码提供不同的视图?

一种方法是在Startup类的Configure方法中使用UseStatusCodePagesWithRedirectsUseStatusCodePagesWithReExecute,通过向控制器添加[HttpGet("error/401")]属性,在控制器上创建响应特定错误代码(例如/error/401的操作方法。

  1. 如何防止调用控制器中的方法?

最好的方法是对我们想要隐藏的方法应用[NonAction]属性。

  1. 我们如何强制路由值为特定类型(例如,数字)?

添加number验证令牌,例如[HttpGet("{id:number]")]

  1. 什么是路线处理程序?

实际处理请求的是IRouter接口的实现。对于 MVC,它通常是MvcRouteHandler类,通过UseMvc扩展方法添加到管道中。

第四章

  1. 模型状态的默认验证提供程序是什么?

它是数据注释 API。

  1. 什么是动作?

可以在控制器上调用以响应 HTTP 请求的方法。

  1. 什么是全球化?全球化与本土化有何不同?

全球化意味着您的应用将支持多种区域性。本地化是使应用正常工作并对特定文化做出相应反应的过程。

  1. 临时数据的用途是什么?

临时数据用于在同一客户端的两个后续请求之间持久化数据,如微会话。

  1. 缓存有什么用?

缓存对于需要很长时间才能生成或检索的数据非常有用。我们将这些数据存储在缓存中,并可以快速访问它。

  1. 什么是会话?

会话是在给定时间范围内与网站进行的一组用户交互。每个交互都通过会话 ID 与会话相关联。

  1. Controller基类继承控制器有什么好处?

Controller类提供了ControllerBase中没有的一些有用方法,例如返回视图的方法(View

第五章

  1. 视图的基类是什么?

RazorPage<T>,其中T泛型类型默认为dynamic

  1. 如何向视图中注入服务?

.cshtml文件上使用@inject声明,或者从RazorPage<T>类继承并使用构造函数注入。

  1. 什么是视图位置扩展器?

它是一个组件,可用于告诉 ASP.NET Core 在何处查找物理.cshtml文件。

  1. 什么是视图布局?

它类似于 ASP.NET Classic 中的母版页。本质上,它定义了不同页面可以使用的布局或结构。

  1. 什么是局部视图?

部分视图类似于 ASP.NET Classic 中的 web 用户控件(.ascx文件)。它们是包含可重用标记的文件,可能还包含要跨不同视图重用的代码。

  1. 什么功能可以替代局部视图?

查看组件。

  1. 特殊文件_ViewStart.cshtml的作用是什么?

无论您在其中输入什么代码、@using@inject声明,都会在实际视图之前执行。

第六章

  1. 默认的验证提供程序是什么?

它是数据注释验证程序。

  1. 用于呈现 HTML 字段的方法叫什么?

HTML 助手。

  1. 什么是模型元数据?

它是描述模型属性的代码,例如它们的显示名称、是否需要它们、它们应该使用什么验证等等。

  1. ASP.NET Core 是否支持客户端验证?

是的。

  1. 什么是可以绑定到上传文件的基本接口?

IFormFile

  1. 什么是不引人注目的验证?

这是一个过程,通过添加几个 JavaScript 库,可以根据一些约定自动设置验证。

  1. 我们如何进行服务器端验证?

通过利用[Remote]属性并在控制器上实现验证操作方法。

第七章

  1. 我们可以使用什么属性来标记方法或控制器,以便只能通过 HTTPS 调用它?

[RequireHttps]

  1. 基于角色的授权和基于策略的授权有什么区别?

基于策略的授权更强大;它可以同时使用这两个角色,也可以使用您可以想到的任何其他自定义需求。

  1. CORS 的目的是什么?

CORS 是一种机制,通过该机制,服务器可以告诉浏览器绕过其正常的安全限制,并允许从不同的源(服务器)加载静态资源(通常是脚本)。

  1. HSTS 的目的是什么?

这是一种告诉浏览器只能通过 HTTPS 与服务器交互的 web 策略。RFC 6797 中对此进行了规定。

  1. 认证过程的挑战阶段是什么?

挑战是当服务器要求客户端提供有效凭据时。

  1. 将请求绑定到模型类时,我们为什么要小心?

我们不希望客户不应提供的敏感信息绑定到模型。

  1. 饼干的滑动过期时间是多少?

这意味着在每次请求时,cookie 的更新时间与最初设置的时间相同。

第八章

  1. 什么是小田?

OData 是一个开放协议,用于公开和使用可查询的 RESTful 数据模型。

  1. 什么是内容协商?

这是一个客户机和服务器就要返回的内容类型达成一致的过程。

  1. 为什么不适合在 web API 中使用 cookie 进行身份验证?

因为这些 API 的客户端通常不是 web 浏览器,因此可能没有存储 cookie 的能力。

  1. 我们可以通过哪些不同的方式请求特定版本的 API?

查询字符串或 HTTP 标头。

  1. 关于行动方法的公约的目的是什么?

约定允许我们定义从每个操作方法返回的返回类型和 HTTP 状态代码,以及可能出现的任何异常。

  1. 问题详情是什么?

以标准方式返回错误信息的一种方法。RFC 7807 中定义了问题详细信息。

  1. 什么是休息?

一种用于定义 web 服务的体系结构样式,设计用于互操作性,它依赖于 HTTP 谓词、URL 和标头。

第九章

  1. 如何从不同的部件加载局部视图?

通过使用嵌入式资源或更好的 Razor 类库。

  1. 呈现局部视图的两种方式是什么?

一个是使用Html.PartialAsync方法,另一个是使用<partial>标记助手。

  1. 标记帮助器和标记帮助器组件之间有什么区别?

标记帮助器呈现组件而不是自定义或 HTML 标记,标记帮助器组件允许我们在呈现所有 HTML 标记之前拦截并可能修改它们。

  1. 我们如何根据环境限制视图上显示的内容?

通过使用<environment>标记帮助器。

  1. Razor 类库和类库有什么区别?

Razor 类库允许我们非常容易地将静态资源提供给 web 项目,而类库只涉及代码。

  1. 什么是嵌入式资源?

包含在程序集中并可以从中检索的静态文件(图像、文本和其他文件)。

  1. 执行视图组件的两个语法是什么?

一个是代码语法-Component.InvokeAsync("mycomponent", new { arg1 = "...", arg2 = 123 })-另一个是标记-<mycomponent arg1="..." arg2="123"/>

第十章

  1. 用于控制资源授权的两个接口是什么?

IAuthorizationFilterIAsyncAuthorizationFilter

  1. 为什么每种过滤器都有两种版本?

总是有一个异步版本,这可能是首选。

  1. 如何通过在动作方法上指定过滤器类型来应用过滤器?

通过ServiceFilterAttributeTypeFilterAttribute进行。

  1. 我们如何将订单应用于过滤器的应用?

当使用属性应用过滤器时,我们可以使用Order属性。

  1. 我们可以应用过滤器的不同级别是什么?

全局、控制器和操作方法。

  1. 我们如何将上下文从一个过滤器传递给其他过滤器?

使用HttpContext.Items集合。

  1. 过滤器如何利用依赖注入?

[ServiceFilter]可根据其类型从 DI 获得过滤器。

第十一章

  1. Razor 页面是否使用代码隐藏?

是的,他们可以,但这不是强制性的。代码隐藏类必须继承自PageModel并与.cshtml文件一起定位。

  1. 页面模型的用途是什么?

它是实现不同 HTTP 谓词(GETPOST等)的处理程序的地方。

  1. 什么是页面处理程序?

它们是在PageModel类中处理请求的代码。

  1. 如何限制匿名用户调用 Razor 页面?

在使用AddRazorPagesOptions方法配置 Razor 页面选项时,我们使用AllowAnonymousToPage扩展方法添加了一个约定,在AddMvc之后。

  1. 我们可以通过哪两种方式将服务注入剃须刀页面?

一种方法是在PageModel类上使用构造函数注入,另一种方法是在.cshtml文件上使用@inject指令。

  1. 剃须刀页面是否使用页面布局?

是的,请确保它们与其他视图布局分开。

  1. 剃须刀页面默认在哪里提供?

Pages文件夹。

第十二章

  1. 什么是事件计数器?

由应用发出并由操作系统拾取的轻量级代码。

  1. 遥测的好处是什么?

从单个仪表板集中存储日志和事件并监视应用。

  1. 我们如何过滤日志记录?

按类别名称或日志级别。

  1. 什么是健康检查?

它们指示我们的应用或依赖项(例如,数据库、外部服务等)的性能。

  1. 中间件在日志记录中有何用处?

在处理请求之前和之后,它可以坐在请求和日志的中间。

  1. 什么是榆树?

错误日志中间件它用于查看处理请求期间引发的事件。

  1. 与普通日志相比,诊断有什么好处?

Diagnostics 提供强类型事件,并与 ELM 集成,以方便查看事件。

第十三章

  1. 什么是比较流行的单元测试框架?

NUnit、xUnit 和 MSTest。

  1. 嘲笑有什么好处?

替换依赖项。

  1. 单元测试和集成测试有什么区别?

单元测试应该是快速的,没有任何副作用,应该只测试一个特定的操作,而集成测试的规模要大得多。

  1. 什么是 TDD?

测试驱动开发:一种提倡从单元测试开始的方法。

  1. 单元测试的局限性是什么?

它们通常不测试用户界面或数据库操作等方面。

  1. 如何将数据自动传递给单元测试?

所有研究的单元测试框架都允许将数据从属性传递到测试方法。

  1. 红绿重构是什么意思?

这是 TDD 的一种实践,我们从编写测试开始,测试最初失败(红色),然后让测试通过(绿色),只有这样,我们才应该担心重构代码以提高效率。

第十四章

  1. 打字脚本有什么好处?

它有很强的类型,是一个完全面向对象的编程模型。

  1. JavaScript 是否只在浏览器上运行?

不,它也可以在服务器端运行。

  1. 什么是温泉?

单页应用,基于 JavaScript 的应用,通过 AJAX 风格的调用调用服务器端功能。

  1. 图书馆经理的目的是什么?

在本地项目中安装客户端库。

  1. dotnet SPA 框架的模板是否已硬编码?

不,它们作为 NuGet 软件包提供,可以安装和更新。

  1. 我们如何从.NET Core 运行 JavaScript 代码?

节点服务提供了这一功能。

  1. 列举一些具有 dotnet 模板的 SPA 框架。

Vue、React、Angular、Aurelia 和 Knockout。

第 15 章

  1. ASP.NET Core 3 可用的两台主机是什么?

红隼和 HTTP.sys。

  1. 可用的两种缓存是什么?

在内存和分布式中。

  1. 压缩响应有什么好处?

最小化响应的延迟。

  1. 缓存响应的目的是什么?

避免了请求和发送响应的需要。

  1. 异步操作是否提高了性能?

没有,但它们提高了可伸缩性。

  1. 什么是捆绑?

捆绑是在单个响应中组合多个文件。

  1. 剖析器有什么用?

它们可以向我们展示代码中执行时间最长的部分。

第十六章

  1. Signal 支持哪两种序列化格式化程序?

JSON 和消息包。

  1. 信号员支持什么交通工具?

AJAX 长轮询、WebSocket 和服务器发送事件。

  1. 消息包协议的好处是什么?

消息包更紧凑,因此延迟更低。

  1. 我们可以向哪些目标发送消息?

单个收件人、所有用户或用户组。

  1. 我们为什么要限制信号员使用交通工具?

某些传输可能不受支持或受到限制,例如 WebSocket。

  1. 我们能否从承载 Signal 的 web 应用外部向其发送消息?

  1. 我们可以用信号机进行身份验证吗?

第 17 章

  1. 页面和组件之间有什么区别?

两者之间的唯一区别是可以直接从浏览器访问页面。

  1. 服务器托管模式和 WebAssembly 托管模式有什么区别?

服务器模型依赖信号器与服务器进行通信,而 WebAssembly 仅存在于正在编译为webassembly的客户机上,因此得名。WebAssembly 在断开连接时可以工作。

  1. 我们可以在 Blazor 页面中使用标签助手吗?

不,我们不能(在.razor文件中)。

  1. 是否可以从 Blazor 内部访问包含的网页?

是的,它是,使用 JavaScript 互操作性。

  1. Blazor 是否支持依赖注入?

是的,但不是构造函数注入。

  1. Blazor 页面布局是否支持区域?

是的,但只有一个区域体。

  1. 组件的不同渲染模式有什么区别?

不同之处在于性能和容量:Static最快,但不支持服务器事件;Server最慢,无法获取参数;ServerPrerendered是两者之间的折衷——组件的 a 部分已预呈现,但实际交互仅在页面完全加载时开始。

第 18 章

  1. 什么是 gRPC?

gRPC 是 Google Remote Procedure Call,这是一种跨平台的技术,用于实现与该技术无关的 web 服务。

  1. URL 重写的目的是什么?

显示用户友好的 URL,这些 URL 将被转换为对应用有意义的内容。

  1. 后台服务的用途是什么?

在后台运行任务。

  1. 区域的用途是什么?

从物理上和概念上分离应用的各个部分。

  1. 习俗有什么好处?

自动强制默认设置。

  1. 我们如何自动执行引用程序集的代码?

通过向库添加一个[HostingStartup]属性并将其包含在ASPNETCORE_HOSTINGSTARTUPASSEMBLIES环境变量中。

  1. 我们可以从组件内部加载文件吗?

是,作为嵌入式资源或来自 Razor 类库。

第 19 章

  1. 使用 IIS 向外界公开应用有什么好处?

例如,您可以添加日志记录和 Windows 身份验证。

  1. 您为什么要将 web 应用作为 Windows 服务托管?

它使启动和停止以及查看服务是否正在运行变得更加容易。

  1. 使用 Docker 有什么好处?

您可以准确地控制依赖项和运行环境。

  1. 什么是自包含部署?

它是一种不需要在目标计算机上安装.NET Core 的部署。

  1. 是否可以在运行时检测更改并自动重新编译代码?

是的,我们只需要运行dotnet watch命令。

  1. 我们可以使用命令行部署还是需要 Visual Studio?

我们可以使用命令行(dotnet)或 Visual Studio。

  1. 您可以从 VisualStudio 内部部署到哪些云提供商?

Azure 和 AWS 就是两个例子。