.NET Core面试问题总结
一、.NET Core
.NET Core 的优点
- 跨平台、高性能的开源框架,基于云原生
- ASP.NET Core 内置简洁且高效的Web 服务器——Kestrel。
- 支持独立部署,即可以把运行时环境打包到一起部署,服务器无须安装.NET Core 环境,这对容器化开发部署非常友好。
- 采用模块化设计,.NET Core 非常精简,所有其他模块都可按需安装,各模块可单独升级,不同程序各模块所用的到组件版本互不影响。
- 引用现代设计思想,例如web请求响应管道,在管道中可以按需增减中间件,容器化IOC,依赖注入,很好的解决程序之间互相依赖关系,
AOP面向切面编程等。
什么是中间件?
是指注入到应用中处理请求和响应的组件。
ASP.NET Core 有那些中间件?
异常、Http严格传输安全协议、 Https重定向、静态文件服务、Cookie策略实施、路由、CORS、身份验证、会话、MVC、Swagge、自定义中间件、
Restful 的优缺点?
REST风格的Web API 中,接口把服务器当成资源来处理。REST风格的接口按照HTTP的语义来使用HTTP,把系统中所有内容抽象为资源。
在 Http 请求中, Delete、Put、Get 应该是幂等的,而Post则不幂等。
幂等:对于一个接口采用相同的参数请求一次或多次,其结果是一样的,不会因为多次请求而产生副作用。
优点:
- 所有的资源都尽量通过 URL 来表示,避免通过 QueryString、报文体来对资源进行定位,这样的URL的语义性更清晰。
- 对所有类型资源的新增、删除、修改、查询操作统一向资源发送Post、Delete、Put、Get请求,接口统一且具有自描述性,减少开发人员对接口文档的依赖性。
- 对于 Get、Put、Delete 等幂等的操作,网关、网络请求组件等可以对失败的请求自动重试。
- 网关等可以对Get请求进行缓存,能够提升系统的访问速度,而且降低服务器的压力。
- 网关可以根据状态码来分析系统的访问数据请求成功率。
缺点:
- 真实系统中的资源非常复杂,很难清晰地进行资源的划分,因此 Restful 风格对设计人员的IT技能和业务知识的水平要求都非常高。
- 真实系统中的业务很复杂,并不是所有的操作都能简单的对应到Put、Get、Delete、Post 上。
简述.NET CORE中IOC生命周期?
Transient
(瞬间的):每次使用(获取这个服务的时候)时都会创建新的服务,适合轻量级的服务。Scoped
(作用域的):在同一次请求中只存在一次的服务。Singleton
(唯一的/单例的):全局只创建一次的服务,第一次被请求的时候被创建,然后就一直使用同一个。
Applicationbuilder 的 Use 和 Run 方法有什么异同?
首先这两个方法都是在 startup 类的 configure 方法里面调用的,并且都是用来向应用请求管道里面添加中间件的。但是 Use 方法可以调用下一个中间件,Run 方法则不能,它是终结式的。
ASP.NET Core 中 AOP 是通过什么来支持的?分别有哪些?
AOP 是通过 Filter 来支持的,分别有 IResourceFilter、AuthorizeFilter、ActionFilter、ExceptionFilter、ResultFilter。
ASP.NET Core Filter 注册方式有哪几种?它们的有效范围
- 方法注册:只对方法生效;
- 控制器注册:只对控制器中的方法生效;
- 全局注册:对整个项目生效;
IoC控制反转是什么?
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。
通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
EFCore查询有那些性能调优小技巧?
(1).使用DbContext池
(2).优先使用异步方法
(3).批处理语句
(4).关闭状态追踪,AsNoTracking()
(5).关闭状态同步,context.ChangeTracker.AutoDetectChangesEnabled = false
MVVM视图模型?
MVVM
全称Model-View-ViewModel
是基于MVC
体系结构模式的改进,MVVM
就是MVC
模式中的View
的状态和行为抽象化,将视图UI
和业务逻辑分开,更清楚地将用户界面UI
的开发与应用程序中业务逻辑和行为的开发区分开来
如何保证token的安全?
- Token授权机制
并将Token-UserId以键值对的形式存放在缓存服务器中。
- 时间戳超时机制
- 签名机制
将 Token 和 时间戳 加上其他请求参数再用MD5或SHA-1算法(可根据情况加点盐)加密,加密后的数据就是本次请求的签名sign,
服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。
签名机制保证了数据不会被篡改。
Nuget包上传管理流程?
- nuget官网下载nuget.exe
- cmd```命令:nuget pack生成x.nupkg文件
- 登录nuget官网创建一个密钥
- cmd命令:
nuget push x.nupkg 密钥 -Source https://api.nuget.org/v3/index.json
- 上传完成,可在VS中搜索到
二、 Redis 缓存更新策略?
怎么保证 Redis 和数据库一致?
更新数据库时增加锁
Redis使用场景有那些?
基础数据缓存,权限缓存,存放Token,计数器,分布式锁
redis
五种数据类型?
string
hash
list
(值不唯一,可以通过pop实现简单消息队列)set
(值唯一)zset
缓存、计数器、分布式会话、分布式锁、消息对列等
RabbitMQ中交换机的理解?
消息(Message)由Client
发送,RabbitMQ
接收到消息之后通过交换机转发到对应的队列上面。Worker
会从队列中获取未被读取的数据处理。RabbitMQ
包含四种不同的交换机类型:
Direct exchange
:直连交换机,转发消息到routigKey
指定的队列Fanout exchange
:扇形交换机,转发消息到所有绑定队列(速度最快)Topic exchange
:主题交换机,按规则转发消息(最灵活)Headers exchange
:首部交换机 (未接触)
三、SqlServr
索引类型有那些?
- 唯一键
- 索引
- 列存储索引
什么样的字段需要加索引?
Where查询条件中经常出现的字段 ,用作表连接的字段 , 还有经常出现在"order by"、"group by"、"distinct" 后的字段上建立索引 , 能有些提高执行效率
注意:同时也要注意某些情况下索引可能会失效的情况 , 比如LIKE模糊匹配语句可能会引起索引失效
数据库有那些性能优化方法?
- SQL语句的优化
- 索引优化
- 数据库表结构优化
Sql Server 事务隔离级别?
1、未提交读(Read uncommitted)
2、提交读(Read committed)
3、可重复读(Repeatable read)
4、可串行化(Serializable)
SqlServer使用SQL分页怎么实现?
A: 1. select top 页大小 from x where id not in(select top 页大小x(页码-1) id from x) 不推荐使用因为in会造成全表扫描。 2. select * from ( select *,ROW_NUMBER() OVER(order by id) as RowId from x ) as t where t.RowId between 页大小x(页码-1) and 页大小x页码 3. --支持SQLSERVER 2012+的版本 SELECT * FROM x ORDER BY id OFFSET 页大小x(页码-1) ROWS --有点像Linq的Skip(x) FETCH NEXT 页大小 ROWS ONLY; --然后Take(x)
Sql行转列,实现效果如下的操作?
数据表: | name | s```ubject | score | | :------| :------ | :------ | | 张三 | 语文 | 80 | | 张三 | 数学 | 70 | | 张三 | 英语 | 60 | | 李四 | 语文 | 90 | | 李四 | 数学 | 80 | | 李四 | 英语 | 70 | 转换为: | name | 语文 | 数学 | 英语 | | :------| :------ | :------ | :------ | | 张三 | 80 | 70 | 60 | | 李四 | 90 | 80 | 70 | A:SqlServer中有PIVOT(旋转)关键字,PIVOT 后跟一个聚合函数来拿到结果,FOR 后面跟的科目是我们要转换的列(列转行使用UNPIVOT): SELECT * FROM t PIVOT ( SUM(score) FOR subject IN (语文, 数学, 英语) ) --SqlServer 2005+的版本 附一个MySql版本: SELECT name SUM(IF(cource="语文", score, 0)) AS "语文", SUM(IF(cource="数学", score, 0)) AS "数学", SUM(IF(cource="英语", score, 0)) AS "英语" FROM t GROUP BY name
四、微服务
分布式锁原理?
通过某种方式加一把锁,让分布式程序执行方法时获取锁,保证 同一个方法同一时刻只能被一台机器上的一个线程访问。
一般实现有:
- 通过数据库实现(加一条记录去读取之类的)。
- 通过
redis
实现。 - 通过
Zookeeper
(不知道是啥)
谈一谈对DDD的理解?
DDD,领域驱动设计。就是通过领域来指导软件设计,是一种十分抽象的软件设计思想,它主要分为战略设计和战术设计
战略方面,通过事件风暴进行领域模型的划分,划分出核心域,子域,支撑域,定义通用语言,划分出有界上下文。
在战术设计方面,ddd将架构分层,“低耦合,高内聚”是架构设计的整体思想。按照DDD思想,可以分为领域层,基础设施层,Web层。
五、.NET 框架
多线程
六、VUE
Vue2 的响应式实现方法是通过观察者模式实现的
Vue3.0 的响应式系统底层使用了 Proxy 对象实现
vue中的挂载是什么意思?
渲染组件,并且构造 DOM 元素然后塞入页面的过程称为组件的挂载。