中间件是什么?在.NET Core中的工作原理又是怎样的呢?10

本文出自《从零开始学ASP.NET CORE MVC》 推荐文章:ASP.NET Core appsettings.json文件

ASP.NET Core 中的中间件(Middleware)

在这个视频中,我们将了解,ASP.NET Core 中的中间件是 什么?中间件很重要,尤其是在你想当架构师这一条路上。

ASP.NET Core 中的中间件是 什么?

在ASP.NET Core中,中间件(Middleware)是一个可以处理HTTP请求或响应的软件管道。 ASP.NET Core中给中间件组件的定位是具有非常特定的用途。例如,我们可能有需要一个中间件组件验证用户,另一个中间件来处理错误,另一个中间件来提供静态文件,如JavaScript文件,CSS文件,图片等等。

我们使用这些中间件组件在ASP.NET Core中设置请求处理管道。而正式这管道决定了如何处理请求。 而请求管道是由Startup.cs文件中的Configure()方法进行配置,它也是应用程序启动的一个重要部分。 以下是Configure()方法中的代码。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
}

如您所见, 由空项目模板生成的Configure()方法中的代码中,一个非常简单的请求处理管道中,只有两个中间件。

UseDeveloperExceptionPage是一个中间件,第二个中间件是使用Run()方法设置的。 现在,通过这个非常简单的请求处理管道,我们所有的应用程序都可以将消息写入,然后在由浏览器显示出来。

我们将在下一个视频中详细介绍此方法中的代码。

现在让我们了解什么是中间件以及它在asp.net Core 中的工作原理。

下图帮助我们了解中间件组件以及它们如何适应请求处理管道

中间件处理流程

在ASP.NET Core中,中间件组件可以同时访问 - 传入请求和传出响应。 因此,中间件组件可以处理传入请求并将该请求,传递给管道中的下一个中间件以进行进一步处理。 例如,如果您有一个日志记录中间件,它可能只是记录请求的时间,它处理完毕后将请求传递给下一个中间件以进行进一步处理。

中间件组件可以处理请求, 并决定不调用管道中的下一个中间件,从而使管道短路,官方微软给了一个英文的名字叫“terminal middleware ”,翻译为“终端中间件”。短路通常是被允许的,因为它可以避免一些不必要的工作。 例如, 如果请求的是像图像或 css 文件这样的静态文件, 则 StaticFiles 中间件可以处理和服务该请求并使管道中的其余部分短路。这个意思就是说,在我们的示例中, 如果请求是针对静态文件, 则 Staticile 中间件不会调用 MVC 中间件,避免一些无谓的操作。

中间件组件可以通过传入的HTTP请求来响应HTTP请求。例如,管道中的mvcmiddleware处理对URL /students的请求并返回学生列表信息。 随着我们在本课程中的进展,在我们即将推出的视频中,我们将演示mvcmiddleware在管道中如何进行请求和响应的。

中间件组件还可以处理传出响应。例如,日志记录中间件组件可以记录响应发送的时间。此外,它还可以通过计算接收请求和响应发送时间之间的差异来计算处理请求所花费的所有时间。

如果你使用过ABP框架,它的审计日志功能是怎么设计的,是否有了一些提示呢。

中间件组件是按照添加到管道的顺序进行执行的。所以我们要注意以正确的顺序添加中间件,否则应用程序可能无法按预期运行,哪怕编译成功,但是程序还是会出错。

在我们即将发布的视频中,我们将通过一个示例,讨论如果中间件组件未按正确顺序添加到处理管道中会发生什么。

中间件组件应该用NuGet包的形式提供。由NuGet处理更新,尽量将中间件拆的足够小,提供每个中间件独立更新的能力。

ABPVNext 就是这样设计的,同样,很多人吼的微服务就是在干这个事情,另外变向说明了,我们很多的架构组就是在开发中间件而已。这些只是我的吐槽,如果你不懂ABP和ABPVnext,也不要紧。以后慢慢学。

根据您的程序要求,您可以向请求处理管道添加尽可能多的中间件组件。例如,如果您正在使用一些静态HTML页面和图像,开发简单的Web应用程序,那么您的请求处理管道可能只包含“StaticFiles”中间件。 这个就是模块化设计带来的好处,让每个人都像玩积木一样。 另一方面,如果您正在开发一个安全的数据驱动设计的Web应用程序,那么您可能需要几个中间件组件,如StaticFiles中间件,身份验证中间件,授权中间件,MVC中间件等。 数据驱动设计,可以简单理解为复杂项目。

我想指出的是,系统是你的,你是系统的架构师, 您可以完全控制请求,处理管道中的配置。这也意味着, 从内存和性能的角度来看, 您只需为请求处理管道中的中间件组件支付流量费和服务器开支就好了。

现在我们已经基本了解了什么是中间件组件以及它们如何适应请求处理管道,在下一个视频中,我们将了解如何使用中间件组件为我们的ASP.NET Core应用程序配置请求处理管道。

所以你看当一个架构师,玩好中间件就可以了。戏言而已,不必当真。。。

原文发布于微信公众号 - 角落的白板报(jiaoluodebaibanbao)

原文发表时间:2019-04-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券