阅读本文你的收获:
- 了解面试中常被问到的中间件相关知识
- 了解ASP.NET Core中的常用内置中间件
- 了解中间件和过滤器的区别
一、几个重要的概念(面试常见题)
1. 什么是管道模型
思考一下:在.NET 中WebForm、MVC、Webapi 之类的框架做应用程序的开发部署之后,用户在浏览器或是利用HttpClient 输入URL地址请求之后,是怎么到达我们的应用程序呢?中间又经过了哪些步骤呢?
![管道模型图](https://i-blog.csdnimg.cn/blog_migrate/f4c9c37f310b9b1ca3766ea3b77bb5d0.png)
管道模型:在用户输入URL之后,Http请求会经过一系列的流转,每次流转都有一些特有的处理,而管道模型就是为Http请求提供支撑和流转而抽象出的一个模型。
管道(Pipeline):从请求到达服务器开始,服务器对该请求进行处理直到响应返回结果的一系列处理过程。
2. 什么是中间件?
中间件(middleware)也叫"中间件组件",中间件组件是一种装配到管道中的,用以处理请求和响应的组件(一段代码或一个类)。请求管道中的每个中间件组件负责调用管道中的下一个组件,或停止调用下一个组件,使"管道短路"。
ASP.NET Core 请求管道包含一系列中间件,依次调用,形成一个链条:(采用了23种设计模式之一 责任链模式)
![中间件模型图](https://i-blog.csdnimg.cn/blog_migrate/2f6b31c1cf47064293a70534bdeb5cdb.png)
3. 如何生成请求管道?
请求委托(RequestDelegate)用于生成请求管道, 请求委托处理每个 HTTP 请求。
将请求委托指定为一个匿名方法或是一个类,这个类(中间件类)或者匿名方法(内联中间件)就是“中间件”;
可以通过三个扩展方法来配置请求委托:
-
Use(委托对象)方法:可以将多个请求委托链接在一起,通过next参数调用下一个请求委托,也可不调用next以使管道短路。
-
Run(委托对象)方法:此方法不会收到next参数,因此用Run配置的请求委托执行完后不会调用下一个,用于终止管道。
-
Map(委托对象)方法:此方法基于给定请求路径的匹配项,来创建请求管道分支;
二.中间件的使用场景
ASP.NET Core 提供了很多内置的中间件,每种中间件都有特定的作用和使用场景。
1. ASP.NET Core常用内置中间件
下表中列举出了一些你需要熟知的内置中间件。
中间件名称 | 英文名称 | 作用 |
---|---|---|
身份验证中间件 | UseAuthentication | 提供身份验证支持 |
异常处理中间件 | UseExceptionHandler | 异常/错误处理 |
跨域中间件 | UseCors | 配置跨域资源共享 |
路由中间件 | UseRouting | 定义和约束请求路由 |
静态文件中间件 | UseStaticFiles | 为静态文件和目录浏览提供服务提供支持 |
授权中间件 | UseAuthorization | 用于授权用户访问安全资源 |
终结点路由中间件 | UseEndpoints | 定义和约束请求路由,用于匹配路由的终端 |
此外,还有Session会话,Cookie,响应缓存等中间件。不管是哪一种中间件,其内部又或多或少会用到以上三个扩展方法Use()、Run()、Map()来配置请求委托。
2. 自定义中间件
当内置中间件不能满足需求时,你也可以自定义中间件(这方面的内容,我们在下一篇博文中进行分享,传送门:自定义中间件 )
3. 中间件在请求管道中的顺序
配置管道中间件时,一定要注意中间件是有顺序的,配置位置不同会产生不同的结果,也可能会导致发生错误。
下图显示了 ASP.NET Core MVC 和 Razor Pages 应用的完整请求处理管道。 你可以在典型应用中了解现有中间件的顺序,以及在哪里添加自定义中间件。 你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件(Custom Middlewares)。
![中间件顺序](https://i-blog.csdnimg.cn/blog_migrate/078d87c92557e4ba6fddd245b3c1654a.png)
三.中间件和过滤器(Filters)的区别
中间件和过滤器都是用来在请求和响应的过程中添加一些逻辑或功能的组件,但它们有一些区别。
中间件是在应用程序管道中的一个组件,它可以拦截请求并决定是否将请求转移给下一个中间件,或者直接返回响应。
过滤器是在 MVC 框架中的一个组件,它可以在控制器的动作执行前后添加一些逻辑或功能,例如授权、异常处理、缓存等。过滤器在 ASP.NET Core 操作调用管道(有时称为过滤器管道)内运行。过滤器管道在 ASP.NET Core 选择了要执行的操作之后运行。见下图:
![过滤器管道](https://i-blog.csdnimg.cn/blog_migrate/15c74ef1671793065e2aad125c054d45.png)
过滤器只能应用于 MVC 的请求,而中间件可以应用于任何类型的请求。我们应该优先选择使用中间件;但是如果这个组件只针对MVC或者需要调用一些MVC相关的类的时候,我们就只能选择过滤器。
本次分享就这么多,希望对你有帮助。关于自定义中间件和过滤器相关的内容,将在后期的博文中分享,欢迎评论+关注。
参考连接: