.NET Core技术研究-中间件的由来和使用

今天

前言

我们将原有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的一个实现:
/// <summary>/// 自定义HTTP扩展模块/// </summary>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()    {    }}
迁移到中间件实现:
/// <summary>/// 自定义中间件/// </summary>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<CustomerMiddleware>();}
    Startup中使用这个中间件:
      app.UseCustomerMiddlewares();
      以上是对ASP.NET Core中中间件的技术由来整理和使用分享。
      (0)

      相关推荐

      • ASP.NET CORE 管道模型及中间件使用解读

        说到ASP.NET CORE 管道模型不得不先来看看之前的ASP.NET 的管道模型,两者差异很大,.NET CORE 3.1 后完全重新设计了框架的底层,.net core 3.1 的管道模型更加灵 ...

      • 14.ASP.NET Core请求处理管道

        在这篇文章中,我将通过一个示例,来讲解ASP.NET Core中的请求处理管道.在这篇文章中,我们将讨论下面几个点: 理解ASP.NET Core请求处理管道 怎样在ASP.NET中创建并注册多个中间 ...

      • 13.在ASP.NET Core中配置中间件组件

        这篇文章中,我们将一起学习在ASP.NET Core中配置中间件组件,以便处理请求处理管道.在阅读这篇文章之前,麻烦大家先去看看,我前面写的一篇文章:ASP.NET Core中间件组件.在这篇文章中, ...

      • 3.介绍ASP.NET Core框架

        介绍ASP.NET Core框架 在这篇文章中,我将要向你们简短介绍一下ASP.NET Core 框架.当今社会,当提到软件开发,每个人都是讨论着开源以及跨平台开发.总所周知,微软是以它的基于Wind ...

      • ASP.NET Core3基础:01. 示例项目搭建与启动顺序

        一.新建示例项目可以通过dotnet cli和visual studio进行创建项目,这里使用vs进行新建这里选择ASP.NET Core Web应用程序 这里选择API,并且把HTTPS的勾去掉,点 ...

      • 减震技术丨周云教授:消能减震技术研究与应用进展

        [卷首语]新中国成立七十年来,我国的建设事业取得了辉煌的成就.结构设计作为建设事业有力保障之一,为建设事业的发展做出了巨大的贡献.为了更好地回顾和总结结构设计相关工程技术.实践经验.科研成果和标准制定 ...

      • 紫禁城古建筑土作技术研究

        周  乾 (本文由<工业建筑>2021年3月22日网络首发) 1  引言 位于北京市中心的紫禁城(今故宫博物院前身)拥有世界上现存规模最大.保存最为完整的木结构古代宫殿建筑群.这些建筑自建 ...

      • 新能源技术研究的机遇与挑战

        来源 | 中科院 中国对全球新能源领域的研究贡献正在逐步扩大.本报告统计近五年除中国外的全球新能源领域发文量发现,扣除中国论文数量后全球新能源发文总量.单个技术领域发文量和年均复合增长率都出现了明显降 ...

      • Ⅳ型车载储氢气瓶关键技术研究进展

         责编:张松  编辑:张赢 氢燃料电池汽车(FCV)以其零排放的特点成为未来汽车的发展趋势,用于存储高压氢气的储氢气瓶是燃料电池汽车必不可少的关键零部件之一.氢能俱乐部整理归纳了Ⅳ型储氢气瓶研发所面临 ...

      • 电解水制氢技术研究进展与发展建议

        一.前言 回顾人类所消耗的能源形式,远古时代的钻木取火.农耕时代开始使用的煤炭.工业时代大规模应用的石油与天然气,这些能源载体的变化体现了减碳加氢.碳氢比降低的趋势.当前,我国碳达峰.碳中和发展目标的 ...

      • 多导弹多目标协同探测信息融合技术研究

        0 引 言 近年来,随着作战飞行器载荷性能的不断提升,过去单一的作战模式逐渐转变为多种飞行器集群联合的作战体系与体系间的对抗.在日益复杂的战场环境下,昔日传统单一作战模式已无法适应大规模空间作战战场环 ...

      • 美国DARPA无人机集群技术研究进展

        转自:军事文摘    作者:曾 鹏 花梁修宇 陈军燕 廖龙文 经过数十年的发展,现代战争的形态已逐步完成从机械化向信息化的过渡,各军事大国之间的差距逐渐减小.为保持军事优势,世界主要军事强国将目光转向 ...

      • 富硒大米生产集成技术研究任务指标

        富硒大米在种植技术上,根据安徽蚌埠地区土壤.天气等天然条件,及水稻品种对产地生态环境的适应性和其富硒能力,筛选品质好.产量高.抗病耐虫害的品种.按照硒肥施用量的不同设计试验梯度,根据富硒效果确定最佳使 ...

      • 6G技术,华为依然领先全球?徐直军:已经加大相关技术研究力度!

        如今5G技术普及已经成为意料之中的事情,各个国家也开始研究6G技术,对此华为轮值董事长表示已经加大了相关技术的研究力度.但在此次发言中他有一句话令人疑惑,他表示华为公司现在依旧在这方面领先于其他国家, ...