在浏览网站或者使用手机App加载内容的时候,浏览器或者手机App其实在向Web服务器发送HTTP请求。服务器在收到HTTP请求后会对用户的请求进行一系列的处理,比如检查请求的身份验证信息、处理请求报文头、检查是否存在对应的服务器端响应缓存、找到和请求对应的控制器类中的操作方法等,当控制器类中的操作方法执行完成后,服务器也会对相应进行一系列处理,比如保存响应缓存、设置缓存报文头、设置CORS报文头、压缩响应内容等。这一系列操作如果全部都硬编码在ASP.NET Core中,会使代码耦合度太高,无法做到按需组装处理逻辑。因此基础框架只完成HTTP请求的调度、报文的解析等必要的工作,其他可选的工作都由不同的中间件来提供。
中间件指的是系统软件和应用软件之间连接的软件,以便于软件之间的沟通,这些中间件组成一个管道,整个ASP.NET Core的执行过程就是HTTP请求和响应按照中间件组装的顺序在中间件之间流转的过程。开发人员可以对组成管道的中间件按照需要进行自由组合,比如调整中间件的顺序、添加或者删除中间件、定义中间件等。
-
-
在ASP.NET Core中执行顺序
在ASP.NET Core中,中间件可以访问到的HTTP请求和HTTP响应,所以可以用来:通过生成一个HTTP响应来处理HTTP请求处理并可以修改HTTP请求,然后将该HTTP请求传给管道上的下一个中间件处理并可以修改HTTP响应,并将HTTP响应传递给管道上的下一个中间件或ASP.NET Core应用
-
asp.net Core个中间件的使用:异常处理程序中间件 (UseExceptionHandler) 捕获以下中间件中引发的异常。
-
HTTP 严格传输安全协议 (HSTS) 中间件 (UseHsts) 添加 Strict-Transport-Security HTTPS 重定向中间件 (UseHttpsRedirection) 将 HTTP 请求重定向到 HTTPS。
-
静态文件中间件 (UseStaticFiles) 返回静态文件,并简化进一步请求处理。
-
用于路由处理的路由中间件 (UseRouting)。
-
身份验证中间件 (UseAuthentication) 尝试对用户进行身份解析验证(过期或不合法等),然后才会允许用户访问安全资源。
-
授权中间件 (UseAuthorization),权限过滤,比如是否已经登录,是否是管理员。
-
终结点路由中间件UseEndpoints,配置路由规则
-
ASP.NET Core 中间件的三个概念:ASP.NET Core中,使用Use和Run扩展方法来向请求管线中注册行内中间件。Run扩展方法允许我们添加终点中间件(即该中间件后面不会再有中间件了)。另外,Use扩展方法允许我们项请求管线中添加可以继续调用下一个中间件的中间件。
-
用Use将多个请求委托链接在一起。 next参数表示管道中的下一个委托。 可通过不调用next参数使管道短路。
-
Run 委托不会收到 next 参数。 第一个 Run 委托始终为终端,用于终止管道。 Run 是一种约定。 某些中间件组件可能会公开在管道末尾运行的 Run[Middleware]
-
Map*扩展用作分支管道的约定。
-
实现中间件:1.通过app.Use自定义中间件,app.Use执行完后可以继续往下执行其他的中间件 app.Use(async (context, next) => { await next.Invoke(); }); 2.App.Run自定义中间件,app.Run这里执行完就结束了,终止下一步的执行,也就是不会执行在它后面的中间件 app.Run(async context => { await context.Response.WriteAsync("Hello from 2nd delegate."); });
-
封装中间件
扩展方法:
传递请求:
-
总结
ASP.NET Core的中间件有以下特点:可同时被访问和请求
可以处理请求,然后将请求传递给下一个中间件
可以处理请求,并使管道短路
可以处理传出响应
中间件是按照添加的顺序执行的。
中间件的工作流程如下:所有的请求都会在每个中间件调用next()方法之前触发。请求按照一定方向依次穿过所有管道
当中间件处理请求并产生响应时,请求处理流程在管道中开始反向传递
所有的响应都会在每个中间件调用next()方法之前触发。响应按一定方向依次穿过所有管道。
-