【开发技术】Asp.NetCore的管道和中间件

目录

一、目的

二、管道概述

三、相关实例

[3.1 管道,使用Run来创建中间件](#3.1 管道,使用Run来创建中间件)

[3.2 使用Use方法添加中间件](#3.2 使用Use方法添加中间件)

四、中间件类型

[4.1 强类型中间件](#4.1 强类型中间件)

[4.2 基于约定的中间件](#4.2 基于约定的中间件)

[4.3 中间件的依赖注入注册](#4.3 中间件的依赖注入注册)

五、文章总结


一、目的

很早以前学习Framework下管道时,记录过自己的理解,在Framework下的管道,类似于Web Services的一种在服务器端处理ASP.NET页面的框架技术,通过HttpHandle和HttpModule来处理请求。后来看.NetCore下的管道和中间件,管道更像一个容器,通过容器中的各种中间件,来处理各种Request请求;这里主要记录下对于Asp.NetCore下的管道和中间件的理解。

二、管道概述

管道是Asp.NetCore的核心。自身是一个长时间运行的后台服务(Web主机服务)。服务运行后才会构建请求管道。管道会绑定到Kestrel来监听请求。Http请求一旦获取,会标准成Http上下文对象,发送给管道。实际处理的就是管道中的各种组件,也就是管道中间件。每个中间件都有特定的功能。

例如:路由、认证、授权等中间件。

MVC就是建立在路由中间件的基础上,该中间件实现了请求和Action之间的映射,并激活控制器、执行动作、渲染视图;

Http请求消息和返回消息,都是一个.Net中的请求上下文HttpContext。

管道的本质是一个Fun类型的委托集合。参数是请求委托,返回也是一个请求委托RequestDelegate(Httpcontext),参数是Httpcontext;

三、相关实例

3.1 管道,使用Run来创建中间件

webhost主机中的Configure就是用来配置管道。管道中的Run方法只是用来接收处理委托,只有请求不会返回,就是终结点中间件,不会向下传递。Host.Run才是运行主机。

3.2 使用Use方法添加中间件

委托可以根据功能需要,自身来判断是否需要往下执行,避免冗余处理。

四、中间件类型

中间件有强类型和基于约定的中间件;

强类型:通过实现中间件的接口和实现方法;

基于约定:不需要实现接口,只需要按照相关形式和预定实现即可。

4.1 强类型中间件

实现IMiddleware接口和方法;

通过依赖注入的方式使用:

可以是瞬时和单例等;

一定要现在依赖注入服务中进行注册,然后在配置管道中添加中间件;

4.2 基于约定的中间件

ps:必需要有效的公共构造函数(RequestDelegate),

必须有一个:Task Invoke(Httprequest,...)

配置约定方式的中间件,不需要注册依赖注入服务,直接在管道中添加即可;还可以传递参数

4.3 中间件的依赖注入注册

需要在使用中间件之前,注册相关服务;一般在使用管道前,相关服务都会注册完毕;

五、文章总结

整个管道处理,是先进后出原则。一个请求过来类似穿过了一个洋葱壳,一个层一层的就是管道,一个管道包一个管道。最先碰到的,穿过后会最后出来。中间件的模式,方便了对Http请求进行自由扩展,新增多少处理中间件,则请求过来经过多少处理流程。通过中间件模式来处理http请求,进行过滤处理,类似httpModule和httphandler的作用结合。

相关推荐
AI绘画哇哒哒1 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
唐青枫2 小时前
一个值多种形态:Zig union、Tagged Union 与内存布局实战
后端
卷无止境2 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker
宝桥南山2 小时前
Blazor Web Assembly - 体验一下Authentication State从Server共享给Client
microsoft·微软·c#·asp.net·.net·.netcore
Nturmoils2 小时前
备份完不算完,先还原到临时库验一遍
后端
Csvn3 小时前
📊 SQL 入门 Day 22:视图与物化视图
后端·sql
Csvn3 小时前
🐍 Day 4: Python 控制流 — 条件、循环与推导式的艺术
后端·python
2601_953720824 小时前
【计算机毕业设计】基于Vue与Spring Boot的高校兼职信息服务平台设计与实现
spring boot·后端·课程设计
再吃一根胡萝卜5 小时前
用 Rust 写一个桌面悬浮图标:为什么它比 Python 更适合 AI 桌面工具?
后端
IT_陈寒5 小时前
Vue的computed属性把我坑惨了,原来我一直用错姿势
前端·人工智能·后端