以下是20道ASP.NET Core相关面试题及答案:
第1题:什么是ASP.NET Core?ASP.NET Core不是ASP.NET的简单升级版本,而是遵循.NET标准架构的全新框架。其核心特点包括:
- 跨平台:支持Windows、Linux、macOS三大操作系统。
- 高性能:基于轻量级模块化设计,请求处理效率显著提升。
- 易配置:通过appsettings.json和Startup类实现灵活配置。
- 可扩展性:依赖注入、中间件等机制支持高度定制化开发。
第2题:ASP.NET Core有哪些核心功能?
- 依赖注入(DI):内置容器支持构造函数注入。
- 日志系统:统一架构支持多日志提供程序(如NLog、Serilog)。
- Kestrel服务器:跨平台网络服务器,可独立运行(无需IIS/Nginx)。
- 命令行工具:通过dotnet CLI快速创建、运行项目。
- 配置管理:使用appsettings.json文件分层配置。
- Startup类:集中注册服务和中间件。
- 异步编程:全面支持async/await模式。
- 实时通信:内置WebSocket和SignalR支持。
- 安全防护:CSRF、CORS等跨站请求防护机制。
第3题:.NET Core相比.NET Framework的优势?
- 跨平台支持:运行于Windows/Linux/macOS。
- 自包含部署:所有依赖与程序打包,无需额外安装。
- 更高性能:优化请求处理流程,吞吐量提升30%以上。
- 灵活配置:支持Docker、Kubernetes等云原生部署方式。
第4题:什么是Meta Packages?Meta Packages是包含所有ASP.NET Core依赖的聚合包,名为Microsoft.AspNetCore.App。通过引用此包可自动引入框架所需的核心组件,简化依赖管理。
第5题:.NET Core应用能否与.NET 4.x库兼容?可以。通过.NET Standard规范实现跨框架兼容,但需注意部分API在.NET Core中可能存在行为差异或不可用。
第6题:什么是Startup类?Startup类是ASP.NET Core应用的入口,必须包含以下两个方法:
- ConfigureServices:注册服务到DI容器。
- Configure:配置中间件请求处理管道。类名可自定义,但需在Program.cs中通过WebApplication.CreateBuilder(args).Build().Run()指定。
第7题:Startup类的ConfigureServices方法作用?用于向DI容器添加服务,例如:
services.AddMvc(); // 添加MVC服务services.AddSingleton<IMyService, MyService>(); // 注册单例服务第8题:Startup类的Configure方法作用?定义HTTP请求处理管道,常用参数包括:
- IApplicationBuilder app:构建中间件管道。
- IWebHostEnvironment env:获取运行环境信息。示例配置:
app.UseRouting();app.UseAuthentication(); // 添加认证中间件app.UseEndpoints(endpoints => endpoints.MapControllers());第9题:什么是中间件(Middleware)?中间件是处理HTTP请求和响应的组件,按顺序组成请求管道。每个中间件可:
- 预处理请求(如认证、日志)。
- 调用下一个中间件(通过await _next(context))。
- 后处理响应(如异常处理)。
第10题:ApplicationBuilder的Use与Run方法区别?
- Use:可调用下一个中间件,常用于条件分支或终端中间件前的预处理。
- Run:终端中间件,不调用后续中间件,通常用于返回静态响应。示例:
app.Use(async (context, next) => { await next(); // 调用下一个中间件});app.Run(async context => await context.Response.WriteAsync("Hello");第11题:管道中的Map扩展作用?根据路径分支处理请求,例如:
app.Map("/admin", adminApp => { adminApp.UseMiddleware<AdminMiddleware>();});第12题:路径处理机制?
- 常规路径:通过MapRoute在Startup中定义,如:endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}");
- 属性路由:在控制器或方法上使用[Route]特性,如:[Route("api/[controller]")]public class ProductsController : Controller { [HttpGet("{id}")] public IActionResult Get(int id) { ... }}
第13题:如何激活Session功能?
- 安装Microsoft.AspNetCore.Session包。
- 在ConfigureServices中添加服务:services.AddDistributedMemoryCache(); // 或其他缓存实现services.AddSession();
- 在Configure中启用中间件:app.UseSession();
第14题:.NET Core工程文件类型?
- .csproj:项目配置文件。
- launchSettings.json:开发环境启动配置(如Kestrel端口)。
- appsettings.json:分层配置文件(Development/Production环境)。
- Program.cs:应用入口,配置主机和中间件管道。
第15题:什么是Tag Helper?Tag Helper是服务器端组件,用于在Razor视图中生成HTML元素。例如:
<a asp-controller="Home" asp-action="Index">Home</a>生成带路由信息的<a>标签。
第16题:如何禁用Tag Helper?在HTML元素前添加!,如:
<!input asp-for="Name" /> <!-- 禁用asp-for特性 -->第17题:什么是Razor页面?Razor Pages是基于页面的开发模型,使用@page指令标记路由,适合内容型网站。文件结构为.cshtml(视图+代码)和.cshtml.cs(页面模型)。
第18题:Razor页面数据绑定?通过[BindProperty]特性实现模型绑定:
[BindProperty]public InputModel Input { get; set; }表单提交时自动映射到Input属性。
第19题:如何在Controller中注入Service?
- 在ConfigureServices中注册服务:services.AddScoped<IMyService, MyService>();
- 在Controller构造函数中声明依赖:public class HomeController : Controller { private readonly IMyService _service; public HomeController(IMyService service) => _service = service;}
第20题:依赖注入的服务生命周期?
- Singleton:通过AddSingleton注册,整个应用生命周期内共享同一实例。
- Transient:通过AddTransient注册,每次请求服务时创建新实例。
- Scoped:通过AddScoped注册,每个HTTP请求范围内共享实例(如数据库上下文)。系统自动管理资源释放,无需手动处置。