首页 > 其他分享 >中间件

中间件

时间:2024-07-29 20:07:57浏览次数:7  
标签:Core await 中间件 next context NET

我是一个不爱说话的人,可是遇见你我变成了话痨。 --zhu
中间件(Middleware)
中间件概念:
中间件是ASP.NET Core的核心组件,MVC框架、响应缓存、身份验证、CORS跨域、Swagger等都是内置中间件。
1、广义上有:Tomcat、WebLogic、Redis、IIS;侠义上:ASP.NET Core在的中间件指ASP.NET Core一个组件。
2、中间件由前逻辑、next、后逻辑3部分组成,前逻辑为第一段要执行的逻辑代码、next为指向下一个中间件的调用、后逻辑为从下一个中间件执行返回所执行的逻辑代码。每个HTTP请求都要经历一系列中间件的处理,每个中间件对于请求进行特定的处理后,再转到下一个中间件,最终的业务逻辑代码执行完成,响应内容会按照处理的相反顺序进行处理,然后形成HTTP响应报文返回给客户端。
3、中间件组成一个管道,整个ASP.NET Core的执行过程就是HTTP请求和响应按照中间件组装的顺序在中间件之间流转的过程。开发人员可以对组成管道的中间件按照需要进行自由组合。

中间件和Filter区别:
中间件是ASP.NET Core这个提供的功能,而Filter是ASP.NET Core MVC中提供的功能。ASP.NET Core MVC是MVC中间件提供的框架,而Filter属于MVC中间件提供的功能。

1、中间件可以处理所有的请求,而Filter只能处理对控制器的请求;中间件运行在一个更底层、更抽象的级别,因此在中间件中无法处理MVC中间件特有的概念。
2、中间件和Filter可以完成很多相似功能。“未处理异常中间件”和“为处理异常Filter”,“请求限流中间件”和“请求限流Filter”的区别。
3、优先选择使用中间件;但是如果这个组件只针对MVC或者需要调用一些MVC相关的类的时候,我们只能选择Filter。

中间件的三个概念
Map、Use和Run。Map用来定义一个管道可以处理哪些请求,Use和Run用来定义管道,一个管道由多个Use和一个Run组成,每个Use引入一个中间件,而Run是用来执行最终的核心应用逻辑。

简单自定义中间件
为了能够更清晰地了解中间件,我们创建一个空的ASP.NET Core项目,然后手动添加中间件。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/test",async appbuilder => {
  appbuilder.Use(async (context,next)=>{
    context.Response.ContentType="text/html";
    await context.Response.WriteAsync("1 Start</br>");
    await next.Invoke();
    await context.Response.WriteAsync("1 end</br>");
  });
  appbuilder.Use(async (context,next)=>{
    context.Response.ContentType="text/html";
    await context.Response.WriteAsync("2 Start</br>");
    await next.Invoke();
    await context.Response.WriteAsync("2 end</br>");
  });
  appbuilder.Run(async ctx=?{
    await ctx.Response.WriteAsync("hello middleware </br>");
  });
});
app.Run();

简单自定义中间件类
1、如果中间件的代码比较复杂,或者我们需要重复使用一个中间件的话,我们最好把中间件的代码放到一个单独的“中间件类”中。
2、中间件类是一个普通的.NET类,它不需要继承任何父类或者实现任何接口,但是这个类需要有一个构造方法,构造方法至少要有一个RequestDelegate类型的参数,这个参数用来指向下一个中间件。这个类还需要定义一个名字为Invoke或者InvokeAsync方法,方法至少有一个HttpContext类型的参数,方法的返回值必须是Task类型。中间件类的构造方法和Invoke(或者InvokeAsync)方法还可以定义其他参数,其他参数的值会通过依赖注入自动赋值。
3、示例:检查请求中是否有password=123的查询字符串,而且会把请求报文体按照Json格式尝试解析为dynamic对象放入context.Items中供后续的中间件或者Run使用。

public class CheckAndParsingMiddleware
{
  private readonly RequestDelegate next;
  public CheckAndParsingMiddleware(RequestDelegate next)
  {
    this.next=next;
  }
  public async Task InvokeAsync(HttpContext context)
  {
    string pwd=context.Request.Query["password"];
    if(pwd=="123")
    {
      if(context.Request.HasJsonContentType())
      {
        var reqStream=context.Request.BodyReaderAsStream();
        dynamic? jsonObj=DJson.Parse(reqStream);
        context.Items["BodyJson"]=jsonObj;
      }
      await next(context);
    }
    else context.Request.StatusCode=401;
  }
}

标签:Core,await,中间件,next,context,NET
From: https://www.cnblogs.com/zhusichen/p/18329887

相关文章

  • Nuxt.js 路由管理:useRouter 方法与路由中间件应用
    title:Nuxt.js路由管理:useRouter方法与路由中间件应用date:2024/7/28updated:2024/7/28author:cmdragonexcerpt:摘要:本文介绍了Nuxt3中useRouter方法及其在路由管理和中间件应用中的功能。内容包括使用useRouter添加、移除路由,获取路由信息,基于HistoryAPI的操作,......
  • 18、flask-进阶-插件-缓存flask-caching - 钩子函数(中间件)
    1.认识flask-caching插件使用插件1.安装$flaskinstallflask-caching2.初始化在exts.py中导入并初始化fromflask_cachingimportCache#初始化插件cache=Cache(config={'CACHE_TYPE':'simple'#缓存类型})#和app对象绑定definit_exts(app):......
  • 如何在 FastAPI 中间件中以不同方式捕获或处理 RequestValidationError 异常?
    如何正确组合RequestValidationError异常处理程序,如:@app.exception_handler(RequestValidationError)asyncdefvalidation_exception_handler(request,exc):response=prepare_response({},g_ERROR__INCORRECT_PARAMS)returnJSONResponse(content=re......
  • 微服务常用的中间件有哪些?都有什么用途?
    前言最近整理一下我们的项目使用了哪些中间件,借此机会也来分享一下,在微服务架构中我们常用的那些中间件,都有什么作用,为什么要使用中间件。消息中间件-RocketMQ比如RocketMQ,RocketMQ是一个开源的分布式消息传递和流处理平台,由阿里巴巴开发并贡献给Apache软件基金会。它被......
  • 深入理解Django:中间件与信号处理的艺术
    引言在当今的Web开发领域,Django以其强大的功能、简洁的代码结构和高度的可扩展性,已成为众多开发者的首选框架。Django不仅是一个内容管理系统,更是一个全面的框架,它提供了一套完整的解决方案,包括ORM、模板引擎、URL路由系统和强大的管理后台,使得开发者能够快速构建高质量的Web......
  • 3. 中间件的最佳方法
    中间件是ASP.NETCore中最强大的概念之一。对于传统的ASP.NET开发人员来说,“中间件”是一个相对较新的术语。在中间件出现之前,存在HTTP处理程序和模块,需要通过web.config进行单独的代码配置。现在,中间件被视为ASP.NET应用程序中的一等公民,使其更易于在单个代码库......
  • 集群及分布式定时任务中间件MEE_TIMED
    集群及分布式定时任务中间件MEE_TIMED转载请著名出处:https://www.cnblogs.com/funnyzpc/p/18312521MEE_TIMED一套开源的定时任务中间件,MEE_TIMED简化了scheduled及shedlock的配置,同时也升级了这两种中间件的能力,使定时任务开发更具灵活性的同时具备集群及分布式节点的管理......
  • [email protected](62)[email protected](11)- 中间件2 - redux-thunk
    目录1,介绍举例2,原理和实现实现3,注意点1,介绍一般情况下,action是一个平面对象,并会通过纯函数来创建。exportconstcreateAddUserAction=(user)=>({type:ADD_USER,payload:user,});这样是有一些限制的无法使用异步的,比如在请求接口之后再做一......
  • 第5章 Express中间件的深入理解(一)
    中间件是Express的核心概念之一,它们可以拦截请求和响应,以便在请求到达路由处理函数之前或在响应发送给客户端之前执行某些操作。在本章中,我们将深入探讨中间件的类型、用法以及如何编写自定义中间件。1中间件概述中间件是具有访问请求对象(req)、响应对象(res)和......
  • 网络安全——挖掘漏洞(中间件漏洞)
    什么是漏洞挖掘?学习网络安全的同学肯定了解过漏洞挖掘,漏洞挖掘通常指的是在软件、系统、网络或任何其他类型的技术系统中寻找安全漏洞的过程。这些漏洞可能允许未经授权的访问、数据泄露、服务中断或其他形式的安全威胁。漏洞挖掘是一个网络安全专业领域。作为初学者,学习......