ASP.NET MVC面试题及答案






2.32/5 (12投票s)
60+ 个最常问的 ASP.NET MVC Core 面试题及答案
如果您不想阅读这篇长文章,可以观看下面的 ASP.NET 面试题及答案视频,其中涵盖了所有问题和答案以及一些小演示。
保持专注,明确您的 ASP.NET 准备范围
当您谈论 ASP.NET 面试时,问题的范围可能非常窄,也可能非常宽。因此,请务必制定适当的准备策略。请记住,ASP.NET 有三个框架版本。我们有 ASP.NET Webforms,于 2003 年推出,随后是 ASP.NET MVC,然后是 ASP.NET MVC Core。
现在,如果您是初级/应届毕业生,我建议您专注于 MVC Core,并表示您只接触过 MVC Core,这样就不会遇到 Webforms 和 MVC 的问题。
但是,如果您是资深人士,您就没有太多选择了。您需要从 Webforms 准备到 MVC Core。
什么是 ASP.NET MVC Core?
ASP.NET MVC Core 是一个开源的、跨平台的框架,用于开发 Web 应用程序。当您使用 ASP.NET Core 开发 Web 应用程序时,它可以在 Windows、Linux 和 Mac 上运行。
能否解释一下 MVC Core、MVC 5 和 Webforms 之间的区别?
现在有大约 10 到 12 个区别,如果我们试图在面试中全部说出来,那是行不通的。请始终记住,让面试官多说,您作为候选人应该说得切题。
我将在下面列出所有 12 点,但建议从粗斜体的前 4 点开始。
Webforms (2003) | ASP.NET MVC 5 (2009) | ASP.NET MVC Core (2017) | |
跨平台 | 否 | 否 | 否 是 |
性能 | 由于视图状态和页面生命周期而导致最差。 | 少于 ASP.NET Core | 所有版本中最好的 |
简化 | 相当复杂 | 中等复杂 | 非常简化 |
云就绪 | 不适用于云 | 不完整 | 是 |
HTML 控件 | 非常少 | 通过 Razor 视图获得良好控制 | 通过 Razor 视图获得良好控制 |
配置 | Web.config | Web.config | Appsetting.json |
依赖注入 | 需要第三方 | 需要第三方 | 内置 |
自托管 | 否 | 否 | 是 (Kestrel) |
静态内容 | 否 | 无此类文件夹 | wwwroot |
Nuget 管理 | 不完全 | 不完全 | 完全 Nuget 管理 |
拖放式控件 | 满分 | 需要编码 | 需要编码。 |
开发 | 仅限 Windows | 仅限 Windows | 您可以使用 VS Code 在 Mac、Linux 上进行开发。 |
能否解释一下 MVC 架构?
![]() | MVC 是一种架构模式,我们将项目划分为三个层。 第一层是视图,其中包含 第二层是模型,它是一个简单的类 控制器连接模型和视图。 因此,第一次命中到达控制器, |
在哪里存储 ASP.NET Core 中的配置?
配置文件存储在一个名为 Appsettings.json 的 JSON 文件中。
如何读取 ASP.NET Core 中的配置文件?
要从 appsettings.json 读取配置,您需要使用“IConfiguration
”接口。
什么是依赖注入?
依赖注入是将依赖对象从外部提供给类的实践,而不是由类自己创建。所以,简单来说,对象创建过程与调用者是隔离的。这有助于创建一个真正解耦的系统。
为什么我们需要依赖注入?
通过使用 DI,类彼此解耦,因此您在一个地方进行的更改会在所有地方得到反映。
如何实现依赖注入?
要实现 DI,我们需要在 Startup.cs 文件中的“ConfigureServices
”方法中添加服务。
解释中间件的概念?
中间件有助于在将请求发送到控制器之前添加预处理逻辑。
如何在 MVC Core 中实现中间件?
中间件在 Startup.cs 文件的“Configure
”方法中添加。
解释 Startup.cs 文件在 ASP.NET Core 中的重要性?
Startup.cs 文件有助于配置依赖注入和中间件。
解释 MVC 中进行 DI 的各种方法?
这是一个易于理解的主题,但很难用简单的词语向面试官解释。因此,我建议您阅读下面的解释,理解它,并创建自己的简短概括。
进行 DI 的方法有三种:Scoped(作用域)、Transient(瞬时)和 Singleton(单例)。
- Transient:每次注入服务时创建新实例。
- Scoped:每向服务器发出的请求创建一次新实例。
- Singleton:为来自任何用户的所有请求实例化一个全局对象。
下图直观地展示了这一点。在 Transient 中,每次依赖注入时,都会注入新的实例。例如,在下面的图像中,“obj
”和“obj1
”在每个请求中都会注入全新的实例。
在 Scoped 的情况下,对于每个请求,都会为每次依赖注入注入相同的实例。因此,“obj
”和“obj1
”将注入相同的实例。
在 Singleton 的情况下,会创建一个大的全局实例。对于所有请求,所有依赖注入都将注入相同的实例。
ASP.NET Core 中进行会话管理的各种方法是什么?
Session
变量Tempdata
ViewData
/ViewBag
ConfigureServices 与 Configure 方法?
在 ConfigureServices
中,我们添加要依赖注入的对象;而在 Configure
方法中,我们指定中间件。
解释 Razor Pages?
Razor 是一种视图引擎,您可以在其中编写 C# 和 HTML 代码。C# 代码在服务器端进行渲染。
如何将模型数据传递给视图?
您可以使用 ViewData 或强类型视图来传递。
什么是强类型视图?
强类型视图是 Razor 视图,其中我们可以获得视图中使用的模型的智能感知。
解释 ViewModel 的概念?
ViewModel 代表要在视图中显示的数据。
解释 Kestrel Web 服务器?
Kestrel 是 ASP.NET Core 应用程序使用的开源默认 Web 服务器。Kestrel 随 ASP.NET Core 一起安装,并充当进程内 Web 服务器来处理 Web 请求。Kestrel 是跨平台的,可以在 Linux、Windows 和 Mac 上运行。
ASP.NET Core 的每个请求都首先经过 Kestrel。
既然有了 IIS,为什么还要 Kestrel Web 服务器?
ASP.NET Core 旨在跨平台运行。因此,IIS 作为默认服务器将无法工作,因为 IIS 仅在 Windows 上运行。NGINX、Apache 等 Web 服务器有自己的应用程序启动运行方式,ASP.NET Core 无法满足所有这些方式。因此,Kestrel 充当进程内 Web 服务器,接收请求,将其发送到 MVC Core 应用程序,获取响应,然后将其发送回主 Web 服务器。
解释反向代理的概念?
反向代理是一种服务器充当中间件的概念。Kestrel 利用反向代理概念,从 IIS/Apache 等主 Web 服务器接收请求,并将其转发到 MVC 应用程序,反之亦然。
什么是 Cookie?
Cookie 是浏览器可以存储用户相关信息的小文本文件。
为什么需要会话管理?
HTTP 协议是无状态的。为了维护状态,我们需要使用会话管理。
ASP.NET 中进行会话管理的各种方法是什么?
进行会话管理有三种方法。
ViewData
/ViewBag
Session
变量Tempdata
什么是会话?
Session
是用户在一段时间内与网站的交互。这是从浏览器打开到浏览器关闭发生的交互。
解释“HTTP 是一个无状态协议”?
HTTP 在请求和响应之间不记住状态。用户发送请求,服务器处理它并发送响应。现在,如果用户在同一会话中再次访问,服务器会将其视为新请求。
进行会话管理有哪些方法?
进行会话管理有三种主要方法:Session
变量、viewdata
/viewbag
和 Tempdata
。
默认启用会话吗?
为了保持 ASP.NET 轻量级,会话变量默认未启用。
如何在 MVC Core 中启用会话?
要在 Startup.cs 中启用会话变量,我们需要“AddSession
”和“UseSession
”。
会话变量是用户之间共享(全局)的吗?
会话变量是为特定用户创建的。会话变量的数据不会在用户之间共享。
会话变量是否使用 Cookie?
是的,会话变量使用 Cookie。
什么是 Cookie?
Cookie 是存储在最终用户计算机上的小型文本文件信息。
解释会话中的空闲超时?
空闲超时是指用户不执行任何活动的时间。因此,如果用户不活跃,您可能希望确保会话变量过期。
HTTP 中的上下文(Context)是什么意思?
HttpContext
包含诸如 session
、请求数据和响应信息等信息。它包含特定请求和响应所需的所有数据。
何时应使用 ViewData?
将数据从控制器传递到视图。
如何将数据从控制器传递到视图?
通过使用 ViewData。
在同一个请求中,ViewData 能否在操作之间持久化?
不,它不会持久化。Viewdata
的范围仅限于从操作到视图。
ViewBag vs ViewData?
ViewBag
是 viewdata
的语法糖。
ViewBag 内部如何工作?
ViewBag
使用动态变量。
解释 ViewModels?
它们代表视图的数据。
ViewBag vs ViewModel - 最佳实践是什么?
为了将数据从操作传递到视图,请使用 viewmodel
,因为 ViewBag
是动态的,我们可能会出错。
解释 TempData?
Tempdata
持久化当前请求,我们可以控制是否需要在下一个请求中使用该状态。
Tempdata 能否在操作重定向之间持久化?
是的。
Tempdata 与 ViewData 有何不同?
Tempdata
可以从一个操作持续到另一个操作(即操作重定向),而 viewdata
仅从操作到视图。
如果读取了 Tempdata,它在下一个请求中是否可用?
不支持。
如何持久化 Tempdata?
通过调用 keep 方法,我们可以持久化 tempdata
。
Tempdata 中的 Keep 方法做什么?
Keep
方法将数据持久化到下一个请求。
解释 Tempdata 中的 Peek?
Peek = Keep + Read。它会读取数据并保留数据。
Tempdata 与 Session 变量有何不同?
Session
变量从浏览器打开一直持续到浏览器关闭。而 tempdata
持久化在操作重定向之间,并且我们可以使用 keep 来决定是否将状态持久化到新请求。
如果我重启服务器,Tempdata 和 Session 会保留吗?
不,tempdata
和 session
在服务器重启后不会持久化。
Tempdata 对用户是私有的吗?
是的,Tempdata
对用户是 private
的。
ViewData vs ViewBag vs Tempdata vs Session Variables
Session
变量的范围从浏览器打开到关闭。Viewdata
的范围仅限于从操作到视图。Viewdata
在操作或控制器重定向时不会持久化。Viewbag
是ViewData
的语法糖。Tempdata
在单个请求中维护数据,无论是否有重定向。- 一旦读取了
tempdata
,状态就不会在请求之间维护。 - 如果我们调用
Keep
方法,即使tempdata
已被读取,tempdata
状态也会在请求之间维护。
什么是 WebAPI?
Web API 控制器通过使用 HTTP REST 服务轻松提供数据和资源。
WebAPI 的优势是什么?
HTTP 是使用最多的协议,因此通过在 HTTP 上公开您的服务,任何类型的客户端都可以使用它,使其成为真正的客户端-服务器模型。所以您的客户端现在可以是移动应用程序,或者是用 JS 框架(如 react/Angular)构建的应用程序,或者是一个简单的浏览器,每个人都可以无缝地与 WebAPI 集成。
解释 REST 及其架构约束?
REST 代表表述性状态转移。REST 是一种架构风格/原则,其中客户端和服务器通过表述和状态进行通信。
REST 的一些重要原则是客户端-服务器、无状态、唯一 URI、通过表述进行的操作。WebAPI 有助于通过 HTTP 协议公开服务/数据。
我们可以将 UDP/TCPIP 协议与 Web API 一起使用吗?
不支持。
WebAPI 与 MVC 控制器有何不同?
在 MVC 控制器中,我们可以返回 RAZOR 视图,但在 WebAPI 中,我们不能返回视图。WebAPI 遵循 REST 原则,并执行内容协商等操作。
什么是 Web API 中的内容协商?
内容协商会查看客户端的接受类型,并根据客户端的接受类型提供数据格式。因此,如果客户端在接受头中发送 XML,它将发送 XML,如果发送 JSON,它将发送 JSON。
WebAPI vs WCF?
WCF 是为 SOA 设计的,XML 是强制格式,并支持任何协议。
WebAPI 是为 REST 设计的,对格式没有强制要求,并且仅支持 HTTP 协议。
WCF REST vs WebAPI REST?
WCF REST 的创建是为了确保旧的遗留 WCF 可以支持 REST。而 WebAPI 是从头开始构建的,以服务于 REST 架构。对于新项目,请使用 WebAPI。如果您想使遗留的 WCF 与 REST 兼容,您将使用 WCF REST。
如何返回 HTTP 状态码?
return StatusCode(StatusCodes.Status200OK,"Test");
对于错误,返回什么状态码?
500 内部服务器错误。
您如何保护您的 Web API?
通过使用 JWT 令牌。
当前的 JS 框架如何与 Webapi 工作?
客户端使用 Angular、React 等 JS 框架构建,它们通过 HTTP 与 MVC 通信。
进一步自学的问题
- Filters 的重要性是什么?
- Generic Host vs WebHost?
- 我们如何管理添加和切换特定于环境的 appsetting 文件?
IApplicationBuilder.Use()
和IApplicationBuilder.Run()
之间有什么区别?htmlhelper
和taghelper
之间有什么区别?- 如何创建自定义
taghelper
? - 如何创建自定义
taghelper
? - 如何创建自己的自定义
htmlhelper
? - 在 ASP.NET Core API 中实现版本控制的方法?
- .csproj 文件及其在 .NET Core 中的重要性。.csproj 文件与之前版本的 .NET 的比较。
- 创建 .NET
std
库和 .NET Core 库之间有什么区别? - 在
Startup Configure
方法中使用UseRouting
和UseEndpoints
的用途是什么? - 如何在
ConfigureServices
方法以外的其他位置存储ServiceCollection
? - 什么是
ViewComponent
?我们可以在ViewComponent
中注入依赖项吗? - 如何在 ASP.NET Core 中使用内存缓存?
- 如何在 ASP.NET Core 中存储字符串和整数以外的对象到会话中。
- 如何在 ASP.NET CORE 中创建自定义中间件
- ASP.NET Core 中 launchsetting.json 的用途?
- 如何在开发过程中配置运行时视图编译:
AddRazorRuntimeCompilation();
健康检查 - ASP.NET CORE MVC 中的
ASYNCACTIONFILTER
- 如何使用 oAuth2.0 保护 ASP.NET Core,什么是 oAuth 中间件?
- ASP.NET Core Web API 和 OWIN 中的身份验证?
- 使用 ASP.NET Core 中的内置 DI 解释工厂模式?
- .csproj 文件及其在 .NET Core 中的重要性。.csproj 文件与之前版本的 .NET 的比较。
- 在 ASP.NET Core API 中实现版本控制的方法
- ASP.NET Core 中的
IOption
是什么?
历史
- 2021 年 7 月 26 日:初始版本