ASP.NET Core 面试宝典【刷题系列】
文章目录
- 引言
- 1、什么是 dot net core 的 startup class?
- 2、什么是中间件?
- 3、application builder 的 use 和 run 方法有什么区别?
- 4、dot net core 管道里面的map拓展有什么作用?
- 5、dot net core 里面的路径是如何处理的?
- 6、如何在 dot net core 中激活 session 功能?
- 7、描述一下依赖注入后的服务生命周期?
- 8、dot net core跟dot net比较有哪些更好的地方?
- 9、asp dot core有哪些好的功能?
- 10、什么是 ASP.NET Core?它与 ASP.NET 有什么区别?
- 11、ASP.NET Core 的启动过程是怎样的?
- 12、ASP.NET Core 中的路由是如何工作的?
- 13、如何实现 RESTful API 的路由?
- 14、什么是模型绑定?
- 15、如何进行模型验证?
- 16、ASP.NET Core 中的日志系统是如何工作的?
- 17、 如何优化 ASP.NET Core 应用程序的性能?
- 18、 如何部署 ASP.NET Core 应用程序?
- 19、如何使用 Docker 部署 ASP.NET Core 应用程序?
- 20、什么是 Kestrel?
- 结语
引言
ASP.NET Core 是一个跨平台、高性能的开源框架,用于构建现代云原生的 Web 应用程序和 API。随着 .NET Core 的普及,ASP.NET Core 成为了许多企业和开发者的首选框架。如果你正在准备 ASP.NET Core 相关的面试,这篇博文将为你提供一份全面的面试宝典,帮助你从基础知识到高级特性全面掌握 ASP.NET Core。
1、什么是 dot net core 的 startup class?
答:Startup class
是 dot net core
应用的入口。所有的 dot net core
应用必须有这个class 这个类用来配置应用。
这个类的调用是在 program main
函数里面进行配置的。类的名字可以自己定义。
2、什么是中间件?
答:中间件是处理 HTTP 请求和响应的组件,它们按照顺序组成请求处理管道。每个中间件可以选择处理请求并将其传递给下一个中间件,或者直接终止管道。
示例:
public void Configure(IApplicationBuilder app)
{
app.Use(async (context, next) =>
{
// 在处理请求之前执行的代码
await next.Invoke();
// 在处理请求之后执行的代码
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello, World!");
});
}
3、application builder 的 use 和 run 方法有什么区别?
答:这两个方法都在 start up class
的 configure
方法里面调用。都是用来向应用请求管道里面添加中间件的。Use
方法可以调用下一个中间件的添加,而 run
不会。
4、dot net core 管道里面的map拓展有什么作用?
答:可以针对不同的路径添加不同的中间件。
5、dot net core 里面的路径是如何处理的?
答:路径处理是用来为进入的请求寻找处理函数的机制。所有的路径在函数运行开始时进行注册。
主要有两种路径处理方式,常规路径处理和属性路径处理。常规路径处理就是用MapRoute
的方式设定调用路径,属性路径处理是指在调用函数的上方设定一个路径属性。
6、如何在 dot net core 中激活 session 功能?
答:首先要添加 session
包. 其次要在 config service
方法里面添加 session
。然后又在 configure
方法里面调用 usesession
。
7、描述一下依赖注入后的服务生命周期?
答:asp.net core
主要提供了三种依赖注入的方式
其中 AddTransient
与 AddSingleton
比较好区别
- AddTransient 瞬时模式:每次都获取一个新的实例
- AddSingleton 单例模式:每次都获取同一个实例
而 AddTransient
与 AddScoped
的区别更不容易区别一点
首先这两种方式每次请求得到的都不是同一个对象,从这点看会发现这两个都一样。
但是我们可以继续分细一点,虽然不同的请求得到的结果不同,但是我们可以在同一次请求中去获取多次实例测试。
📌小总结:
- AddTransient瞬时模式 :每次请求,都获取一个新的实例。即使同一个请求获取多次也会是不同的实例
- AddScoped:每次请求,都获取一个新的实例。同一个请求获取多次会得到相同的实例
- AddSingleton单例模式:每次都获取同一个实例
8、dot net core跟dot net比较有哪些更好的地方?
- 第一是跨平台,它可以运行在三大操作系统上面,windows, Linux和MAC。
- 第二是对架构本身安装没有依赖,因为所有的依赖都跟程序本身在一起。
- 第三是
dot net core
处理请求的效率更高,能够处理更多的请求。 - 第四是
dot net core
有更多的安装配置方法。
9、asp dot core有哪些好的功能?
- 第一是依赖注入。
- 第二是日志系统架构。
- 第三是引入了一个跨平台的网络服务器,
kestrel
。可以没有iis, apache和nginx
就可以单独运行。 - 第四是可以使用命令行创建应用。
- 第五是使用
APP settings json file
来配置工程。 - 第六是使用
start up
来注册服务。 - 第七是更好的支持异步编程。
- 第八是支持
web socket
和signal IR
。 - 第九是对于跨网站的请求的预防和保护机制。
10、什么是 ASP.NET Core?它与 ASP.NET 有什么区别?
答:
ASP.NET Core 是 ASP.NET 的下一代版本,它是一个跨平台、高性能的开源框架,用于构建现代 Web 应用程序和 API。与传统的 ASP.NET 相比,ASP.NET Core 具有以下优势:
- 跨平台:可以在 Windows、Linux 和 macOS 上运行。
- 高性能:经过优化,性能显著提升。
- 模块化:通过 NuGet 包管理,按需引入功能。
- 依赖注入:内置支持依赖注入。
- 统一框架:MVC 和 Web API 使用统一的编程模型。
11、ASP.NET Core 的启动过程是怎样的?
ASP.NET Core 应用程序的启动过程主要包括以下几个步骤:
- 创建主机:通过
CreateHostBuilder
方法创建主机。 - 配置服务:在
ConfigureServices
方法中注册服务。 - 配置中间件:在
Configure
方法中配置请求处理管道。 - 运行应用程序:调用
Run
方法启动应用程序。
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
12、ASP.NET Core 中的路由是如何工作的?
ASP.NET Core 使用路由系统将传入的 HTTP
请求映射到相应的控制器和操作方法。路由可以通过两种方式配置:
- 约定路由:在
Startup
类的Configure
方法中使用MapRoute
方法配置。 - 属性路由:在控制器和操作方法上使用
[Route]
属性配置。
示例:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
13、如何实现 RESTful API 的路由?
在 ASP.NET Core 中,可以使用属性路由来实现 RESTful API
的路由。
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
// 获取所有产品
}
[HttpGet("{id}")]
public IActionResult GetById(int id)
{
// 根据 ID 获取产品
}
[HttpPost]
public IActionResult Create(Product product)
{
// 创建新产品
}
[HttpPut("{id}")]
public IActionResult Update(int id, Product product)
{
// 更新产品
}
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
// 删除产品
}
}
14、什么是模型绑定?
模型绑定是将 HTTP
请求中的数据映射到控制器操作方法参数的过程。ASP.NET Core 支持多种模型绑定方式,包括查询字符串、表单数据、路由数据、请求体等。
15、如何进行模型验证?
ASP.NET Core 提供了数据注解(Data Annotations
)来进行模型验证。常用的数据注解包括 [Required]、[StringLength]、[Range]
等。
public class Product
{
[Required]
public int Id { get; set; }
[StringLength(100)]
public string Name { get; set; }
[Range(0, 1000)]
public decimal Price { get; set; }
}
在控制器中,可以通过 ModelState.IsValid
属性来检查模型是否有效。
[HttpPost]
public IActionResult Create(Product product)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
// 处理有效的产品数据
}
16、ASP.NET Core 中的日志系统是如何工作的?
ASP.NET Core 提供了一个灵活的日志系统,支持多种日志提供程序(如控制台、调试、文件、Azure App Service 等)。日志系统通过 ILogger
接口提供记录日志的能力。
17、 如何优化 ASP.NET Core 应用程序的性能?
ASP.NET Core 提供了多种性能优化手段,包括:
- 缓存:使用内存缓存、分布式缓存等。
- 响应压缩:启用响应压缩以减少传输数据量。
- 异步编程:使用异步方法提高并发处理能力。
- 数据库优化:优化数据库查询,使用索引等。
- CDN:使用 CDN 加速静态资源的加载。
18、 如何部署 ASP.NET Core 应用程序?
ASP.NET Core 应用程序可以部署到多种环境中,包括 IIS、Azure、Docker、Linux 等。常见的部署方式包括:
- IIS:将应用程序发布到 IIS 服务器。
- Azure:将应用程序发布到 Azure App Service。
- Docker:将应用程序打包为 Docker 容器并部署到 Kubernetes 或其他容器编排平台。
- Linux:将应用程序发布到 Linux 服务器并使用 Nginx 或 Apache 作为反向代理。
19、如何使用 Docker 部署 ASP.NET Core 应用程序?
首先,创建一个 Dockerfile
文件:
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["MyApp.csproj", "./"]
RUN dotnet restore "./MyApp.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyApp.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]
然后,使用以下命令构建和运行 Docker
镜像:
docker build -t myapp .
docker run -p 8080:80 myapp
20、什么是 Kestrel?
Kestrel
是 ASP.NET Core 的跨平台 Web 服务器,它是 ASP.NET Core 应用程序的默认服务器。Kestrel
是一个高性能的服务器,支持 HTTP/2
和 WebSocket
。
结语
ASP.NET Core 是一个功能强大且灵活的框架,掌握其核心概念和高级特性对于面试和实际开发都非常重要。希望这篇博文能帮助你在 ASP.NET Core 面试中脱颖而出,顺利拿到心仪的职位!
如果你有任何问题或需要进一步的帮助,欢迎在评论区留言,我会尽快回复你。祝你面试顺利!