首页 > 其他分享 >.Net Core(七) 管道和中间件

.Net Core(七) 管道和中间件

时间:2024-03-05 16:23:09浏览次数:23  
标签:Core HTTP 请求 处理 中间件 响应 Net

简介

管道

.NET Core 中的管道是一个用于处理 HTTP 请求的组件。它是 ASP.NET Core 应用程序的核心部分,负责将传入的 HTTP 请求传递给适当的处理程序并生成响应。管道由一系列中间件组成,每个中间件都可以对请求或响应进行操作,然后将其传递给下一个中间件或终止请求处理。

中间件

在ASP.NET Core中,中间件是在请求处理管道中按顺序执行的一系列组件,每个中间件都可以执行特定的操作,并且可以选择将请求传递给下一个中间件或者中断请求处理。

以下是一些常见的中间件操作:

  1. 请求处理:中间件可以处理传入的HTTP请求,例如解析请求参数,读取请求正文等。

  2. 响应生成:中间件可以生成HTTP响应,例如构建HTML页面、JSON响应等。

  3. 异常处理:中间件可以捕获并处理请求处理过程中发生的异常,例如返回自定义错误页面或JSON错误消息。

  4. 身份验证和授权:中间件可以执行身份验证和授权逻辑,例如检查用户的凭证并决定是否允许访问受保护的资源。

  5. 日志记录:中间件可以记录请求和响应的详细信息,例如请求路径、HTTP方法、响应代码等。

  6. 缓存:中间件可以缓存处理过的请求或响应,以提高性能并减少对后端资源的请求次数。

  7. 路由选择:中间件可以根据请求的路径选择不同的处理逻辑或者将请求重定向到不同的终端中间件。

  8. 静态文件服务:中间件可以提供静态文件服务,例如提供网站的CSS、JavaScript、图像等文件。

中间件在ASP.NET Core中的注册顺序非常重要,因为它们按照注册的顺序依次执行。开发人员可以通过在Startup类的Configure方法中使用UseMiddleware方法来注册和配置中间件。由于中间件的模块化特性,开发人员可以轻松地组合和重用现有的中间件来实现复杂的应用逻辑。

HTTP请求处理流程

以下是.NET Core 管道的一般工作流程:

  1. 请求处理: 当收到HTTP请求时,它首先经过Kestrel,Kestrel作为HTTP服务器接收请求,并将请求传递给ASP.NET Core应用程序。

  2. 中间件处理: 请求被传递给管道中的第一个中间件。中间件执行其操作,然后可以选择将请求传递给下一个中间件,也可以提前结束请求处理。

  3. 中间件链: 请求在一系列中间件之间传递,每个中间件都可以执行特定的操作。这些操作可能包括记录日志、验证身份、授权、路由选择等。

  4. 最终处理: 请求最终被传递给终结点(EndPoint),终结点可以是一个控制器的动作方法、一个页面、或者是一段特定的中间件。它负责生成HTTP响应。

  5. 响应返回: 响应通过中间件链返回,每个中间件都可以对其进行修改,直到到达Kestrel,Kestrel将响应返回给客户端。

ASP.NET Core 管道的灵活性使得开发人员可以轻松地添加、删除或替换中间件来实现各种功能,如身份验证、日志记录、缓存、异常处理等。这种模块化的设计使得应用程序的逻辑可以更好地组织和重用,同时提高了代码的可维护性和可测试性。

案例

想象你去银行取钱,银行的取款流程可以看作是一个管道,而每个环节则是一个中间件。

  1. 安全门:当你到达银行时,首先会经过安全门,安全门会检查你的身份证以及行李。

  2. 身份验证:你递交身份证给柜员,柜员会验证你的身份并核对信息。

  3. 账户检查:银行系统会检查你的账户信息,确保你有足够的余额进行取款。

  4. 取款处理:如果一切正常,银行系统会处理你的取款请求,并将钱款从你的账户中扣除。

在这个过程中,安全门、身份验证、账户检查、取款处理都可理解为中间件,如果柜员发现你的身份证信息有问题(比如过期、姓名不匹配等),他们可能会立即提前返回,不继续处理你的取款请求,这就相当于中间件在处理过程中提前返回,不将请求传递给下一个中间件。这样可以避免在后续环节发生不必要的处理,提高效率并避免可能的问题。

标签:Core,HTTP,请求,处理,中间件,响应,Net
From: https://www.cnblogs.com/mchao/p/18051875

相关文章

  • 【HMS Core】集成推送服务,打包后应用名乱码
    ​【问题描述】使用flutter进行移动端开发,导入了agconnect-services.json之后,成功集成了华为推送,但是应用打包如果应用名为中文,debug包生成的应用名会是乱码。​​ 【问题分析】1、经推测可能是agc插件与开发者引入的另外的sdk相冲突导致的,但即使去掉其他的sdk也会导致该问......
  • AI应用开发之路-准备:发起一个开源小项目 DashScope SDK for .NET
    今年我们有一个眼高手低的计划,打算基于SemanticKernel+DashScope(阿里云模型服务灵积)+Qwen(通义千问大模型),结合园子已有的产品与应用场景,开发面向开发者的AI应用,并将整个过程与大家分享。目前处于准备阶段,这篇博文分享的是遇到的第一个问题,并由此发起一个小开源项目......
  • 往 netty Channel中写入字符串
    示例代码:EventLoopGroupgroup=newNioEventLoopGroup();Bootstrapbootstrap=newBootstrap();bootstrap.group(group).channel(NioSocketChannel.class).option(ChannelOption.SO_KEEPALIVE,true)......
  • Windows 操作系统中,Internet 协议版本 4 (TCP/IPv4) 的配置信息通常是保存在注册表中
    %SystemRoot%\system32\tcpipcfg.dll%SystemRoot%\system32\drivers\tcpip.sysSystem32\drivers\tcpip.sys%SystemRoot%\System32\wshtcpip.dll%SystemRoot%\System32\mswsock.dll%SystemRoot%\System32\perfnet.dll%SystemRoot%\System32\wsock32.dll......
  • 学习笔记:ST-MetaNet
    UrbanTrafficPredictionfromSpatio-TemporalDataUsingDeepMetaLearning使用深度元学习进行城市交通预测期刊会议:KDD2019论文地址:https://dl.acm.org/doi/10.1145/3292500.3330884代码地址:(mxnet)https://github.com/panzheyi/ST-MetaNet总结感觉这篇论文的元学......
  • asp.net core 中基于策略的授权-自定义授权
    前两篇文章扫盲篇,进阶篇中介绍了基本的asp.netcore中基于策略的授权的使用方法。使用策略授权时,只能指定策略,不能配置其他信息。[Authorize(Policy="AtLeast21")]//指定要验证的策略publicclassAlcoholPurchaseController:Controller{publicIA......
  • NetCore3.1 引入PostgerSql + DbFirst
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、新建控制台项目PostgreSQLApp,引入如下包<ProjectSdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp3.1</TargetFramework></Prope......
  • ASP.NET Core - 配置系统之配置读取
    一个应用要运行起来,往往需要读取很多的预设好的配置信息,根据约定好的信息或方式执行一定的行为。配置的本质就是软件运行的参数,在一个软件实现中需要的参数非常多,如果我们以HardCode(硬编码)的方式写在应用代码中,这样配置就会很乱,而且后续也不容易修改。乱而多,而且不容易修改,......
  • ASP.NET Core策略授权和ABP授权
    首先我们来创建一个WebAPI应用。然后引入Microsoft.AspNetCore.Authentication.JwtBearer包。策略Startup类的ConfigureServices方法中,添加一个策略的形式如下:services.AddAuthorization(options=>{options.AddPolicy("AtLeast21",policy=>......
  • netty client请求127.0.0.1:8081,server端无响应问题排查
    问题描述代码:https://github.com/normanmaurer/netty-in-action/tree/2.0-SNAPSHOT/chapter2利用netty,起了两个服务:echoServer,绑定8081端口。echoClient,请求127.0.0.1:8081端口。client和server建立链接之后,并发送报文:publicclassEchoClientHandlerextendsSi......