C#/.Net面试题及答案
1. 对ASP.NET Core kestrel的理解
ASP.NET Core是一个跨平台的开源框架,用于构建现代的,基于云的,互联网连接的应用程序。ASP.NET Core Kestrel是一个跨平台的、开源的、高性能的、轻量级的Web服务器,专门用于托管ASP.NET Core应用程序。它完全在.NET上构建,且可以运行在Windows/Linux/macOS,Kestrel是ASP.NET Core应用的默认服务器。
Kestrel有以下几个重要特点:
1)跨平台: Kestrel支持跨平台,因此可以运行在任何支持.NET Core的平台上。
2)高性能:被设计为高性能的服务器,它利用了异步I/O和非阻塞网络操作,这有助于提高吞吐量和响应性。它使用异步I/O操作来减少线程使用并提高吞吐量
3)轻量级,Kestrel是一个轻量级的服务器,它不需要额外的软件依赖,如传统的Web服务器(IIS/Apache),专注于处理HTTP请求和响应,不包含完整的Web服务器功能集(如IIS/Apache/Nginx/Tomcat等所具有的功能),Kestrel可以通过代理服务器弥补其不足的部分。
4)安全性:Kestrel提供了许多安全性功能,如TLS/SSL支持、HTTP/2支持和请求大小限制。还可以配置Kestrel以使用HTTP严格传输安全(HSTS)和其他安全相关的HTTP头。
5)中间件:Kestrel与ASP.NET Core中间件管道集成,这意味着你可以在Kestrel级别添加自定义中间件,例如用于请求日志记录、认证等。
6)容器支持:Kestrel轻量级和跨平台特性非常适合在容器化环境中运行,如Docker,这使得ASP..NET Core应用程序可以轻松地部署到云平台。
7)调试和日志记录:Kestrel提供了调试和日志记录功能,这有助于开发人员诊断问题。
8)配置:Kestrel可通过ASP.NET Core的Startup.cs文件或appsettings.json配置文件进行配置,包括设置监听的端口、启用HTTPS、限制请求大小等。
9)启动速度快
2. .NET Core 支持哪些操作系统,它的跨平台特性是如何实现的?
-
统一的运行时(CoreCLR): CoreCLR 是 .NET Core 的运行时,它是跨平台的,可以在 Windows、Linux 和 macOS 上运行。CoreCLR 负责执行中间语言(IL)代码,管理内存,以及提供垃圾回收等服务。
-
跨平台类库: .NET Core 提供了一套丰富的跨平台类库(BCL),这些库在不同操作系统上提供一致的 API,使得开发者可以编写一次代码,然后在多个平台上运行。
-
开源协作: .NET Core 是在 GitHub 上开源的,允许全球开发者参与贡献,确保了 .NET 的跨平台兼容性和持续改进。
-
跨平台开发工具: .NET Core 提供了跨平台的命令行界面(CLI),使得开发者可以在不同操作系统上使用相同的工具和命令来构建、测试和发布应用程序。
-
容器化支持: .NET Core 应用程序可以容器化,利用 Docker 等容器技术在不同环境中提供一致的运行时环境,从而实现跨平台部署。
-
跨平台项目管理: .NET Core 项目使用
.csproj
文件格式,这种格式支持跨平台的项目配置,使得项目文件在不同操作系统上保持一致。 -
依赖于操作系统的功能抽象: 对于特定操作系统的功能,.NET Core 提供了抽象层,允许开发者编写平台无关的代码,同时在需要时可以通过平台特定的 API 访问操作系统服务。
-
跨平台测试: .NET Core 支持跨平台测试,可以使用相同的测试框架(如 xUnit 或 NUnit)在不同操作系统上运行测试用例。
-
跨平台数据库访问: .NET Core 提供了 Entity Framework Core 等 ORM 工具,支持跨平台数据库访问,使得开发者可以使用相同的代码在不同数据库系统上工作。
-
跨平台 UI 框架: .NET Core 可以与跨平台的 UI 框架(如 Xamarin.Forms 或 MAUI)集成,提供跨平台的桌面和移动应用开发能力。
-
.NET 5 和 .NET 6+: 从 .NET 5 开始,微软推出了统一的 .NET 平台,它合并了 .NET Core 和 .NET Framework 的功能,进一步简化了跨平台开发。
3. 有哪些机制避免数据脏读和脏写
在.Net中,服务框架提供了多种机制来避免数据脏读和脏写:
1)事务隔离级别
通过设置适当的事务隔离级别,可以管理并发事务的可见性和一致性。ADO.NET Core支持多种事务隔离级别,包括Read Uncommitted/Read Committed/Repeatable Read/Serializable,这些级别有助于平衡性能和数据准确性/完整性。
2)乐观锁
乐观锁通常通过版本号或时间戳来实现。在更新数据前,检查版本号是否发生变化,如果发生变化则放弃更新或提示用户。这种方式适用于冲突较少的场景,可以减少锁的开销,提供并发性能。
3)悲观锁
悲观锁假设冲突经常发生,在数据访问前就锁定数据。Entity Framework Core通过SQL查询实现悲观锁,例如使用For Update语句锁定数据行,防止其他事物修改。
4)分布式锁
在分布式系统中,使用分布式锁来保证跨多个节点的操作原子性。DistributedLock是一个.Net库,提供基于不同底层技术的分布式互斥锁、读写锁和信号量。
5)消息队列
使用消息队列来确保操作的顺序执行,减少并发冲突。消息队列可以帮助实现最终一致性,尤其是在分布式系统中。
6)缓存策略
如果使用缓存,确保缓存数据的一致性,比如通过缓存失效策略或缓存更新机制。
7)数据验证
在数据写入前进行严格的验证,确保数据的完整性和一致性。
4. .NET 如何选型ORM框架?
1)Entity Framework Core:
优势:EF Core是微软官方的ORM框架,与.NET Core深度集成,支持Code First和Db First开发模式,它提供了强大的LINQ支持和数据库迁移功能,适合快速开发。
劣势:与Dapper相比,性能略低,尤其是在处理复杂查询时。
应用场景:适合需要快速开发和原型设计的项目,以及需要和ASP.NET Core紧密集成的应用程序。
2)Dapper:
优势:以其轻量级和高性能著称,接近原生SQL执行的效率。它提供了灵活的SQL执行和映射能力。它专注于性能和简单性,它不提供像EF Core那样的高级特性
劣势:需要手动编写SQL语句,可能增加出错风险,且学习曲线较陡峭。
应用场景:适合对性能要求极高的项目,以及需要精细控制SQL语句的场景。适合不需要太多抽象层的应用。
3)SqlSugar:
优势:SqlSugar是一个轻量级、高效、灵活的.NET ORM框架,支持多种数据库,提供链式操作和表达式支持,以及丰富的扩展功能。
劣势:社区支持相对较弱,可能在遇到问题时获取帮助的渠道较少。
应用场景:适合需要跨数据库开发且对性能有一定要求的项目。
4)FreeSQL:
优势:FreeSql提供丰富的功能和良好的性能,支持多种数据库,且易于使用和扩展。
劣势:相对于EF Core和Dapper,社区和文档资源较少。
应用场景:适合需要高性能和跨数据库支持的项目,尤其是希望保持一定开发效率的项目。
5)NHibernate:
优势:是一个.NET平台上成熟的ORM之一,支持多种数据库、提供丰富的功能包括缓存、事务管理,延迟加载和集合映射等、提供强大的查询能力支持HQL和Criteria API能够构建复杂查询、社区支持。
劣势:学习曲线较高,配置较为复杂,需要较多的配置文件或代码来设置映射关系,由于其丰富的功能,有时会带来一定的性能开销。
应用场景:适合需要处理复杂业务逻辑的企业级应用,需要支持多种不同类型的数据库类型、需要复杂的查询、事务管理和缓存机制等项目。
在选择ORM框架时,应该根据项目的具体需求,团队的技术栈和经验、以及对性能和功能的要求来做出决策。如果项目需要快速开发和良好的开发体验,EF Core可能是一个好的选择;如果项目对性能要求极高,Dapper可能更合适;如果需要一个轻量级和支持多种数据库的ORM,SqlSugar可能是一个不错的选择。