ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ASP.NET Core面试必备:核心概念与实战技巧

ASP.NET Core面试必备:核心概念与实战技巧 1. ASP.NET Core 面试题概述作为一名.NET开发者ASP.NET Core是必须掌握的核心框架。在技术面试中面试官通常会通过一系列问题来考察候选人对ASP.NET Core的理解深度和实际应用能力。本篇文章将汇总常见的ASP.NET Core面试题帮助开发者系统性地准备面试。ASP.NET Core是一个跨平台、高性能的开源框架用于构建现代云基础的互联网连接应用程序。与传统的ASP.NET相比它采用了全新的架构设计具有模块化、轻量级和高性能等特点。在面试中面试官通常会从基础概念、核心特性、中间件、依赖注入、配置系统等多个维度进行考察。2. ASP.NET Core 基础概念2.1 ASP.NET Core 与 ASP.NET 的区别ASP.NET Core是ASP.NET的重新设计版本两者之间存在显著差异跨平台支持ASP.NET Core可以运行在Windows、Linux和macOS上而传统ASP.NET仅支持Windows性能优化ASP.NET Core的性能显著优于ASP.NET特别是在请求处理速度和内存使用方面架构设计ASP.NET Core采用模块化设计通过NuGet包提供功能而ASP.NET是一个整体框架依赖注入ASP.NET Core内置了依赖注入容器而ASP.NET需要依赖第三方库配置系统ASP.NET Core使用基于键值对的配置系统取代了ASP.NET的web.config文件2.2 Startup类的作用Startup类是ASP.NET Core应用程序的入口点包含两个主要方法public class Startup { public void ConfigureServices(IServiceCollection services) { // 配置应用程序服务 services.AddControllers(); services.AddDbContextApplicationDbContext(options options.UseSqlServer(Configuration.GetConnectionString(DefaultConnection))); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 配置HTTP请求管道 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseEndpoints(endpoints { endpoints.MapControllers(); }); } }ConfigureServices方法用于配置应用程序的服务依赖注入Configure方法用于配置HTTP请求管道中间件2.3 应用程序生命周期ASP.NET Core应用程序的生命周期包括以下几个阶段程序启动Main方法执行创建WebHostBuilder主机配置配置服务器、日志、配置源等服务注册Startup.ConfigureServices方法执行请求管道配置Startup.Configure方法执行请求处理服务器接收请求通过中间件管道处理程序终止应用程序关闭触发IHostApplicationLifetime事件3. ASP.NET Core 核心特性3.1 中间件(Middleware)中间件是ASP.NET Core处理HTTP请求的核心组件组成一个请求处理管道。每个中间件可以处理传入的请求处理传出的响应调用管道中的下一个中间件短路管道不调用下一个中间件常见的内置中间件app.UseExceptionHandler(/Error); // 异常处理 app.UseHsts(); // HTTP严格传输安全协议 app.UseHttpsRedirection(); // HTTPS重定向 app.UseStaticFiles(); // 静态文件服务 app.UseRouting(); // 路由 app.UseAuthentication(); // 认证 app.UseAuthorization(); // 授权 app.UseEndpoints(endpoints endpoints.MapControllers()); // 终结点自定义中间件示例public class RequestLoggerMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; public RequestLoggerMiddleware(RequestDelegate next, ILoggerRequestLoggerMiddleware logger) { _next next; _logger logger; } public async Task InvokeAsync(HttpContext context) { _logger.LogInformation($Request: {context.Request.Method} {context.Request.Path}); await _next(context); _logger.LogInformation($Response: {context.Response.StatusCode}); } } // 扩展方法用于注册中间件 public static class RequestLoggerMiddlewareExtensions { public static IApplicationBuilder UseRequestLogger(this IApplicationBuilder builder) { return builder.UseMiddlewareRequestLoggerMiddleware(); } }3.2 依赖注入(Dependency Injection)ASP.NET Core内置了轻量级的IoC容器支持构造函数注入、方法注入和属性注入不推荐。服务生命周期Transient每次请求都会创建一个新的实例Scoped每个请求范围内共享同一个实例Singleton整个应用程序生命周期内共享同一个实例服务注册示例services.AddTransientITransientService, TransientService(); // 瞬时 services.AddScopedIScopedService, ScopedService(); // 作用域 services.AddSingletonISingletonService, SingletonService(); // 单例3.3 配置系统ASP.NET Core提供了灵活的配置系统支持多种配置源public static IHostBuilder CreateHostBuilder(string[] args) Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) { config.SetBasePath(Directory.GetCurrentDirectory()); config.AddJsonFile(appsettings.json, optional: true, reloadOnChange: true); config.AddJsonFile($appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json, optional: true); config.AddEnvironmentVariables(); config.AddCommandLine(args); }) .ConfigureWebHostDefaults(webBuilder { webBuilder.UseStartupStartup(); });访问配置值public class MyService { private readonly IConfiguration _configuration; public MyService(IConfiguration configuration) { _configuration configuration; } public void DoWork() { var connectionString _configuration.GetConnectionString(DefaultConnection); var timeout _configuration.GetValueint(Timeout); } }4. ASP.NET Core 高级主题4.1 路由系统ASP.NET Core提供了强大的路由系统支持传统路由和属性路由。传统路由配置app.UseEndpoints(endpoints { endpoints.MapControllerRoute( name: default, pattern: {controllerHome}/{actionIndex}/{id?}); endpoints.MapAreaControllerRoute( name: admin, areaName: Admin, pattern: Admin/{controllerHome}/{actionIndex}/{id?}); });属性路由示例[Route(api/[controller])] [ApiController] public class ProductsController : ControllerBase { [HttpGet({id})] public ActionResultProduct GetById(int id) { // ... } [HttpPost] public IActionResult Create(Product product) { // ... } [HttpPut({id})] public IActionResult Update(int id, Product product) { // ... } [HttpDelete({id})] public IActionResult Delete(int id) { // ... } }4.2 模型绑定与验证ASP.NET Core自动将HTTP请求数据绑定到控制器方法参数[HttpPost] public IActionResult Create([FromBody] ProductDto product) { if (!ModelState.IsValid) { return BadRequest(ModelState); } // 处理有效数据 return Ok(); }数据注解验证public class ProductDto { [Required] [StringLength(100)] public string Name { get; set; } [Range(0.01, 10000)] public decimal Price { get; set; } [Required] [RegularExpression(^[A-Z]{2,3}$)] public string Category { get; set; } }4.3 身份认证与授权ASP.NET Core支持多种认证方案services.AddAuthentication(options { options.DefaultAuthenticateScheme JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options { options.TokenValidationParameters new TokenValidationParameters { ValidateIssuer true, ValidateAudience true, ValidateLifetime true, ValidateIssuerSigningKey true, ValidIssuer Configuration[Jwt:Issuer], ValidAudience Configuration[Jwt:Audience], IssuerSigningKey new SymmetricSecurityKey( Encoding.UTF8.GetBytes(Configuration[Jwt:Key])) }; });授权策略services.AddAuthorization(options { options.AddPolicy(RequireAdminRole, policy policy.RequireRole(Admin)); options.AddPolicy(Over18, policy policy.RequireAssertion(context context.User.HasClaim(c c.Type ClaimTypes.DateOfBirth DateTime.Parse(c.Value).AddYears(18) DateTime.Today))); });在控制器中使用[Authorize(Roles Admin)] public class AdminController : Controller { [Authorize(Policy Over18)] public IActionResult AdultContent() { return View(); } }4.4 性能优化技巧响应缓存[ResponseCache(Duration 60)] public IActionResult Index() { return View(); }内存缓存services.AddMemoryCache(); public class MyService { private readonly IMemoryCache _cache; public MyService(IMemoryCache cache) { _cache cache; } public string GetCachedData() { return _cache.GetOrCreate(cacheKey, entry { entry.AbsoluteExpirationRelativeToNow TimeSpan.FromMinutes(5); return GetDataFromDatabase(); }); } }分布式缓存services.AddStackExchangeRedisCache(options { options.Configuration Configuration.GetConnectionString(Redis); });响应压缩services.AddResponseCompression(options { options.Providers.AddGzipCompressionProvider(); options.EnableForHttps true; });异步编程[HttpGet] public async TaskIActionResult GetProducts() { var products await _productRepository.GetAllAsync(); return Ok(products); }5. 常见面试问题与解答5.1 基础问题什么是KestrelKestrel是ASP.NET Core的跨平台Web服务器基于libuv.NET Core 2.x或托管Socket.NET Core 3.x。它轻量、快速可以直接处理HTTP请求也可以与IIS、Nginx等反向代理服务器配合使用。什么是中间件举例说明中间件是组成请求处理管道的组件每个中间件可以处理请求和响应。例如UseStaticFiles提供静态文件服务UseAuthentication处理身份认证UseRouting路由请求到正确的处理程序依赖注入的生命周期有哪些Transient每次请求都创建新实例Scoped每个请求范围内使用同一实例Singleton整个应用程序生命周期使用同一实例5.2 进阶问题如何在ASP.NET Core中实现AOP可以通过以下方式实现面向切面编程中间件处理横切关注点如日志、异常处理过滤器FiltersAction执行前后插入逻辑拦截器Interceptors使用第三方库如Castle DynamicProxy装饰器模式包装服务实现如何优化ASP.NET Core应用程序的性能使用异步编程模型启用响应压缩实现缓存策略内存、分布式优化数据库查询减少中间件数量使用性能分析工具识别瓶颈如何实现自定义模型绑定实现IModelBinder接口public class CustomModelBinder : IModelBinder { public Task BindModelAsync(ModelBindingContext bindingContext) { var valueProviderResult bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (valueProviderResult ValueProviderResult.None) { return Task.CompletedTask; } // 自定义绑定逻辑 var value valueProviderResult.FirstValue; bindingContext.Result ModelBindingResult.Success(value); return Task.CompletedTask; } } // 注册模型绑定器 services.AddControllers(options { options.ModelBinderProviders.Insert(0, new CustomModelBinderProvider()); });5.3 实战问题如何实现文件上传功能[HttpPost(upload)] public async TaskIActionResult UploadFile(IFormFile file) { if (file null || file.Length 0) return BadRequest(No file uploaded); var uploads Path.Combine(_environment.WebRootPath, uploads); if (!Directory.Exists(uploads)) Directory.CreateDirectory(uploads); var filePath Path.Combine(uploads, file.FileName); using (var fileStream new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(fileStream); } return Ok(new { filePath }); }如何实现JWT认证// 配置JWT services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options { options.TokenValidationParameters new TokenValidationParameters { ValidateIssuer true, ValidateAudience true, ValidateLifetime true, ValidateIssuerSigningKey true, ValidIssuer Configuration[Jwt:Issuer], ValidAudience Configuration[Jwt:Audience], IssuerSigningKey new SymmetricSecurityKey( Encoding.UTF8.GetBytes(Configuration[Jwt:Key])) }; }); // 生成Token public string GenerateJwtToken(User user) { var claims new[] { new Claim(JwtRegisteredClaimNames.Sub, user.Id), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(ClaimTypes.Name, user.UserName), new Claim(ClaimTypes.Role, user.Role) }; var key new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration[Jwt:Key])); var creds new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token new JwtSecurityToken( issuer: _configuration[Jwt:Issuer], audience: _configuration[Jwt:Audience], claims: claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: creds); return new JwtSecurityTokenHandler().WriteToken(token); }如何实现实时通信使用SignalR实现实时功能// 配置SignalR services.AddSignalR(); app.UseEndpoints(endpoints { endpoints.MapHubChatHub(/chatHub); }); // Hub实现 public class ChatHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync(ReceiveMessage, user, message); } } // 客户端连接 const connection new signalR.HubConnectionBuilder() .withUrl(/chatHub) .configureLogging(signalR.LogLevel.Information) .build(); connection.on(ReceiveMessage, (user, message) { // 处理接收到的消息 }); connection.start().catch(err console.error(err.toString()));6. 面试准备建议理解核心概念确保对中间件、依赖注入、配置系统等核心概念有深入理解实践项目经验准备2-3个使用ASP.NET Core开发的实际项目案例熟悉常见模式了解仓储模式、工作单元、CQRS等常见架构模式性能优化掌握常见的性能优化技巧和工具安全实践熟悉认证授权、防跨站脚本(XSS)、防跨站请求伪造(CSRF)等安全措施测试知识了解单元测试、集成测试在ASP.NET Core中的应用最新特性关注ASP.NET Core的最新版本特性提示在面试中除了回答问题外展示解决问题的思路和方法同样重要。当遇到不熟悉的问题时可以分享你的分析过程和可能的解决方案路径这往往比直接给出正确答案更能体现你的能力。
返回列表