中间件是什么?在.NET Core中的工作原理又是怎样的呢?
本文出自《从零开始学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应用程序配置请求处理管道。
所以你看当一个架构师,玩好中间件就可以了。戏言而已,不必当真。。。
更多精彩内容都在视频中哦~
硬广专区
如果您觉得我的文章质量还不错,欢迎打赏,也可以订阅我的视频哦
未得到授权不得擅自转载本文内容,52abp.com保留版权
文字版目录: https://www.52abp.com/Wiki/mvc/latest/1.Intro
交流QQ群:952387474《微软MVP带你学ASP.NET CORE》
【收费】腾讯课堂: https://ke.qq.com/course/392589?tuin=2522cdf3
【免费】youtube视频专区:http://t.cn/Ei0F2EB
免费的更新慢,收费的更新快,仅此而已。就这样。
「好看」的人都【在看】↓↓↓
中间件是什么?在.NET Core中的工作原理又是怎样的呢?相关推荐
- 详解JSP 中Spring工作原理及其作用
详解JSP 中Spring工作原理及其作用 1.springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作. 2.Dispat ...
- 电源设计中电容的工作原理及选用
电源往往是我们在 电路设计过程中最容易忽略的环节.作为一款优秀的设计,电源设计应当是很重要的,它很大程度影响了整个系统的性能和成本. 电源设计中的 电容使用,往往又是电源设计中最容易被忽略的地方. 一 ...
- 零线与地线既然都是接地的,它们的区别在哪里,零线在变压器中的工作原理是怎样的?
零线与地线既然都是接地的,它们的区别在哪里,零线在变压器中的工作原理是怎样的? 2012-4-16 09:54 提问者: qq1034665088 | 浏览次数:574次 我来帮他解答 20 ...
- OCR算法:车牌识别在停车系统中的工作原理
车牌识别在停车场系统中的工作原理 1.车辆查看:可采用埋地线圈查看.红外查看.雷达查看技术.道闸视频查看等多种办法感知车辆的通过,并触发图像搜集抓拍. 2.图像搜集:通过高清摄像抓拍主机对通行车辆进行 ...
- 为什么我的会话状态在ASP.NET Core中不工作了?
原文:Why isn't my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookie ...
- Android中AMS工作原理,Android AMS启动详解
启动 在Android系统启动流程中中我们提到过,AMS是在system_service中启动的, //frameworks/base/services/java/corri/android/serv ...
- Java中AJAX工作原理是什么
AJAX 指异步JavaScript 及XML(Asynchronous JavaScript And XML). 传统的Web应用允许用户填写表单(form),当提交表单时就向Web服务器发送一个请 ...
- Hadoop1.x中HDFS工作原理
HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Googl ...
- java substring实现_Java中substring()工作原理
01.substring() 是干嘛的 sub 是 subtract 的缩写,因此 substring 的字面意思就是"把字符串做个减法".这样一分析,是不是感觉方法的命名还是蛮有 ...
最新文章
- 手把手教你在多种无监督聚类算法实现Python(附代码)
- 018-继承-OC笔记
- 父元素a标签的href默认行为以及子元素绑定的click事件的响应之间存在影响
- wxWidgets:wxAuiManager类用法
- 【经典回放】多种语言系列数据结构算法:二叉树(C#版)
- 怎么做图片文字二维码一起_怎么做?才能让文字编排更出彩
- 对Java的URL类支持的协议进行扩展的方法
- 解决Ubuntu下切换到root用户后没有声音问题
- CSS 背景尺寸 background-size属性
- 苹果今年秋季或发布史上最多新品
- Linux grep及正则表达式
- 算法:Reverse String(反转字符串)
- 【VISIO2016箭头使用】
- 智能优化算法:人工水母搜索算法 -附代码
- Mac 下载破译版本 secureFX 和 secureCRT
- 三角形外接球万能公式_【光速解题】如何秒定各类外接球的球心
- docker curl: (56) Recv failure: Connection reset by peer问题解决方法
- Spread 常用属性
- 【TODO】Java并发:@GuardedBy
- 自动驾驶车载相机rosenberger接口防呆设计
热门文章
- 自定义v-drag指令(横向拖拽滚动)
- C++回声服务器_4-UDP connect版本客户端
- PHP 7.2 新功能介绍
- 微信小程序 --- 页面跳转
- Valid Number
- 转载.Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- 接口返回json对象出现套娃递归问题 | System.Text.Json 版本
- 全部换新-微软复兴.NET,C#10 .NET6 VS2022各个强势!
- 从零实操基于WSL2 Docker部署Asp.Net Core项目
- 王炸!Azure云助力.NET6现高光时刻(VS2022实战尝鲜)