(给DotNet加星标,提升.Net技能)

转自:Eric zhoucnblogs.com/tianqing/p/12633780.html

前言

我们将原有ASP.NET应用升级到ASP.NET Core的过程中,会遇到一个新的概念:中间件。

中间件是ASP.NET Core全新引入的概念。中间件是一种装配到应用管道中以处理请求和响应的软件。每个组件:

  • 选择是否将请求传递到管道中的下一个组件。

  • 可在管道中的下一个组件前后执行工作。

单独看以上中间件的定义,一个很直观的感觉:中间件是HTTP请求管道中的一层层的AOP扩展。

在展开介绍中间件之前,我们先回顾一下ASP.NET中HttpHandler和HttpModule的处理方式。

一、ASP.NET中HttpHandler和HttpModule

先看一张图:

上图中有两个概念HttpHandler和HttpModule,其中:

HttpHandler用于处理具有给定文件名或扩展名的请求。比如上图中的.report类的请求,同时,任何一个HttpHandler都需要实现接口IHttpHandler,都需要在Web.Config配置文件中注册使用。

HttpModule用于处理每个请求调用,比如上图中的Authorization Module,每个Http请求都会经过HttpModule的处理。通过HttpModule可以中断Http请求,可以自定义HttpResponse返回。同时,任何一个HttpModule都需要实现接口IHttpModule,都需要在Web.Config配置文件中注册使用。

ASP.NET Core引入了中间件来实现上面2种Http请求处理扩展。ASP.NET Core中间件和ASP.NET HttpHandler HttpModule有什么区别?

二、ASP.NET Core中间件和ASP.NET HttpHandler HttpModule的区别

1、中间件比HttpHandler、HttpModule更简单

  • "模块"、"处理程序"、" Global.asax.cs"、 "WEB.CONFIG" (IIS配置除外)和 "应用程序生命周期" 消失

  • 中间件已使用HttpHandler HttpModule的角色

  • 中间件使用代码而不是在 web.config 中进行配置

  • 通过管道分支,可以将请求发送到特定的中间件,不仅可以基于 URL,还可以发送到请求标头、查询字符串等。

2、中间件类似于HttpModule     

  • 处理每个请求调用

  • 可以实现Http请求中间和继续

  • 能够创建自定义的HttpResponse

3、中间件和HttpModule按不同的顺序处理

  • 中间件的顺序取决于它们插入请求管道的顺序,而模块的顺序主要基于应用程序生命周期事件

  • 中间件中Http响应的顺序与Http请求的顺序相反,而对于HttpModule,请求和响应的顺序是相同的。

三、ASP.NET Core中间件的设计原理

ASP.NET Core 请求管道包含一系列请求委托,依次调用。下图演示了这一概念。沿黑色箭头执行。

每个请求委托(中间件)都可以在下一个请求委托(中间件)之前和之后执行操作。中间件中的异常处理委托应该在管道的早期被处理,这样就可以捕获在管道后期发生的异常。

在Startup.Configure 方法中添加中间件组件的顺序定义了针对请求调用这些中间件的顺序,以及响应的相反顺序。这个顺序对于安全性、性能和功能非常重要。

看一段示例代码:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment())    {        app.UseDeveloperExceptionPage();        app.UseDatabaseErrorPage();    }else    {        app.UseExceptionHandler("/Error");        app.UseHsts();    }    app.UseHttpsRedirection();    app.UseStaticFiles();

//app.UseCookiePolicy();    app.UseRouting();// app.UseRequestLocalization();// app.UseCors();    app.UseAuthentication();    app.UseAuthorization();//app.UseSession();    app.UseEndpoints(endpoints =>    {        endpoints.MapRazorPages();        endpoints.MapControllerRoute(            name: "default",            pattern: "{controller=Home}/{action=Index}/{id?}");    });}

上述代码中每个中间件扩展方法都通过 Microsoft.AspNetCore.Builder 命名空间在 IApplicationBuilder 上公开。

app.Use***都是各种常用的内置中间件。比如:

1、异常处理类中间件。如上述代码中:

当应用在开发环境中运行时:异常显示页中间件 (UseDeveloperExceptionPage) 报告应用运行时错误。数据库错误页中间件报告数据库运行时错误。(app.UseDatabaseErrorPage();)

当应用在生产环境中运行时:异常处理程序中间件 (UseExceptionHandler) 捕获以下中间件中引发的异常。TTP 严格传输安全协议 (HSTS) 中间件 (UseHsts) 添加 Strict-Transport-Security 标头。

2、HTTPS 重定向中间件 (UseHttpsRedirection) 将 HTTP 请求重定向到 HTTPS。

3、静态文件中间件 (UseStaticFiles) 返回静态文件,并简化进一步请求处理。

4、Cookie 策略中间件 (UseCookiePolicy) 使应用符合欧盟一般数据保护条例 (GDPR) 规定。

5、用于路由请求的路由中间件 (UseRouting)。

6、身份验证中间件 (UseAuthentication) 尝试对用户进行身份验证,然后才会允许用户访问安全资源。

7、用于授权用户访问安全资源的授权中间件 (UseAuthorization)。

8、会话中间件 (UseSession) 建立和维护会话状态。如果应用使用会话状态,请在 Cookie 策略中间件之后和 MVC 中间件之前调用会话中间件。

9、用于将 Razor Pages 终结点添加到请求管道的终结点路由中间件(带有 MapRazorPages 的 UseEndpoints)。

10、对于单页应用程序 (SPA),SPA 中间件 UseSpaStaticFiles 通常是中间件管道中的最后一个。SPA 中间件处于最后的作用是:允许所有其他中间件首先响应匹配的请求。允许具有客户端侧路由的 SPA 针对服务器应用无法识别的所有路由运行。

还有很多其他的内置中间件,可以参考链接:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.0。如下图,

了解了ASP.NET Core内置的中间件之后,我们可能需要自定义一些中间件,比如说原有的ASP.NET HttpModule和HttpHandler.

接下来第四部分,我们继续示例

四、自定义中间件

将已有HttpModule用自定义中间件实现

先看一下原有HttpModule的一个实现:

/// /// 自定义HTTP扩展模块/// public class CustomerHttpModule : IHttpModule{public void Init(HttpApplication context){        context.BeginRequest += Context_BeginRequest;    }private void Context_BeginRequest(object sender, EventArgs e){        HttpApplication app = (HttpApplication)sender;// Do something    }public void Dispose(){    }}

迁移到中间件实现:

/// /// 自定义中间件/// public class CustomerMiddleware{private readonly RequestDelegate _next;public CustomerMiddleware(RequestDelegate next){      _next = next;    }public async Task Invoke(HttpContext context){// Do something with context near the beginning of request processing.await _next.Invoke(context);// Clean up.    }}

同时增加IApplicationBuilder的一个扩展方法:

public static IApplicationBuilderUseCustomerMiddleware(this IApplicationBuilder builder){return builder.UseMiddleware();}

Startup中使用这个中间件:

app.UseCustomerMiddlewares();

以上是对ASP.NET Core中中间件的技术由来整理和使用分享。

推荐阅读  点击标题可跳转.NET 5 Preview 2 发布Xaml+C#桌面客户端跨平台初体验你所不知道的C#中的细节

看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能

好文章,我在看❤️

iis中间件_.NET Core技术研究中间件的由来和使用相关推荐

  1. .NET Core技术研究-主机

    前一段时间,和大家分享了 ASP.NET Core技术研究-探秘Host主机启动过程 但是没有深入说明主机的设计.今天整理了一下主机的一些知识,结合先前的博文,完整地介绍一下.NET Core的主机的 ...

  2. ASP.NET Core技术研究-全面认识Web服务器Kestrel

    因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel.相信大家刚接触这个Kestrel时,会有各种各样的疑问. 今天我们全面认识一下ASP. ...

  3. 多个中间件_前端如何正确使用中间件?

    简介:中间件可以算是一种前端中常用的"设计模式"了,有的时候甚至可以说,整个应用的架构都是使用中间件为基础搭建的.那么中间件有哪些利弊?什么才是中间件正确的使用姿势?本文将分享作者 ...

  4. aspx 使用什么中间件_.NET Core中间件与依赖注入的一些思考

    点击上方蓝字"小黑在哪里"关注我吧 1.起源? 为什么会有这篇文章呢? 源于我看了老A的aspnet core 3 框架揭秘[1]请求管道 篇产生的疑惑? 三点疑惑: Single ...

  5. ASP.NET Core技术研究-探秘依赖注入框架

    ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET ...

  6. python消息队列中间件_常见的消息队列中间件介绍

    题目 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 什么是消息队列 在正式介绍和对比Kafka. ...

  7. 部署被测软件应用和中间件_使用FlexDeploy对融合中间件应用程序进行自动化软件测试...

    部署被测软件应用和中间件 自动化软件测试是任何软件组织都必须执行的强制性活动之一,以保证其产品质量. 但是,此过程通常变得相当复杂,尤其是涉及由多个不同部分组成的现代复杂系统的自动化测试时. 所有这些 ...

  8. 依赖注入的三种方式_ASP.NET Core技术研究-探秘依赖注入框架

    ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET ...

  9. mysql为什么需要中间件_为什么要用数据库中间件

    问题一:数据库存储的数据量不大,但并非的读写操作都很大,超过数据库服务器的处理能力. 基于阿里云RD版测试结果(Mysql处理性能) CPU        内存        连接数        T ...

  10. ASP.NET Core URL Rewrite中间件

    URL重写是基于一个或多个预置规则修改请求URL的行为.URL重写在资源位置和访问地址之间创建了一种抽象,这样二者之间就减少了紧密的联系.URL重写有多种适用的场景: 临时或永久移动或替换服务器资源, ...

最新文章

  1. C++中的四类强制转换?
  2. TCP丢包检测技术详解
  3. MySQL Explain详解,分析语句为何运行慢
  4. C++map容器-插入和删除
  5. 借助Fargate和EKS,AWS甚至可以实现Cloud-ier和Kuberneties-ier
  6. Win7下安装配置gVim
  7. ubuntu下安装mssql(sqlserver)客户端及使用
  8. jQuery cxSlide 焦点图轮换
  9. CentOS _ RHEL 防止Kernel升级
  10. tp5部署到nginx后所有分页404的解决办法
  11. 在Windows Server2012系统中安装Oracle11g
  12. jQuery设置iframe的高度根据页面内容自适应
  13. 小米 红米 历代手机型号大全 发布时间 发布价格
  14. 不用写代码也能学会采集海量企业电话及邮箱数据
  15. 爱普生L3153打印机如何清洗喷头
  16. 正在学习的比较详细的机器学习教程(不断更新)
  17. VoLTE呼叫SIP信令分析
  18. maven module 路径_解决maven项目中-Dmaven.multiModuleProjectDirectory报错问题
  19. 医师计算机考试,医师资格考试机考-计算机作答的操作指导
  20. linux Nginx服务的安装及使用

热门文章

  1. javascript模拟抽奖
  2. Ubuntu16.04 + ROS下串口通讯
  3. odoo 开发者模式添加计算字段
  4. shift and算法
  5. 面试高并发,看这篇就够了(下)
  6. dom块级元素的各种宽高
  7. 我的程序员之路(英语的学习)
  8. 研究生马上要毕业了,可是完全写不出论文,该退学吗?
  9. 【IJCAI2021】长文本知识抽取:基于语义分割的文档级三元组关系抽取
  10. 【代码技巧】21个经典深度学习句间关系模型