首页 > 其他分享 >.net6 中间件

.net6 中间件

时间:2023-06-07 09:33:27浏览次数:43  
标签:请求 app 中间件 管道 路由 net6 模板

参照资料:

ASP.NET Core 中间件 | Microsoft Learn

ASP.NET Core端点路由 作用原理 - 知乎 (zhihu.com)

一、概念

中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:

  • 选择是否将请求传递到管道中的下一个组件。
  • 可在管道中的下一个组件前后执行工作。
// 创建了一个 WebApplicationBuilder 实例,用于配置应用程序的服务和中间件。
var builder = WebApplication.CreateBuilder(args);

// 1、配置(添加)应用程序的服务.

// 1.1、在应用程序的服务容器中注册了一个控制器服务,以便能够使用 ASP.NET Core MVC 框架来处理 HTTP 请求。
builder.Services.AddControllers();
//1.2.1在应用程序的服务容器中注册了一个终结点 API 浏览器服务,以便能够使用 Swagger UI 来查看和测试 API 文档。
builder.Services.AddEndpointsApiExplorer();
//1.2.2在应用程序的服务容器中注册了一个 Swagger 生成器服务,以便能够生成和发布 Swagger/OpenAPI 文档。
builder.Services.AddSwaggerGen();

//2、使用 builder.Build() 方法构建应用程序的实例
var app = builder.Build();

//2.1检查应用程序的环境是否为开发环境,并在开发环境下使用 Swagger 和 Swagger UI 中间件,以便能够查看和测试 API 文档。
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
//2.2启用 HTTPS 重定向中间件,将所有 HTTP 请求重定向到 HTTPS。
app.UseHttpsRedirection();
//2.3启用授权中间件,以便能够使用 ASP.NET Core 身份验证和授权机制来保护应用程序的资源。
app.UseAuthorization();
//2.4将控制器路由配置到应用程序的请求处理管道中,以便能够处理 HTTP 请求并返回响应。
app.MapControllers();


//3、启动应用程序,并等待传入的请求。
app.Run();

使用 RunMapUse 扩展方法来配置请求委托。 可将一个单独的请求委托并行指定为匿名方法(称为并行中间件),或在可重用的类中对其进行定义。 这些可重用的类和并行匿名方法即为中间件,也叫中间件组件。 请求管道中的每个中间件组件负责调用管道中的下一个组件,或使管道短路。

当中间件短路时,它被称为“终端中间件”,因为它阻止中间件进一步处理请求。eg:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.Run(async context =>
{
    await context.Response.WriteAsync("Hello world!");
});

app.Run();

这路app.Run(...)就属于一个“终端中间件”,因为请求经过这个中间件的时候会让直接返回Hello world!,不会执行后续的操作

Use 将多个请求委托链接在一起。 next 参数表示管道中的下一个委托。 可通过不调用 next 参数使管道短路。 通常可在 next 委托前后执行操作,如以下示例所示:

img

当委托不将请求传递给下一个委托时,它被称为“让请求管道短路”。 通常需要短路,因为这样可以避免不必要的工作。 例如,静态文件中间件可以处理对静态文件的请求,并让管道的其余部分短路,从而起到终端中间件的作用。 如果中间件添加到管道中,且位于终止进一步处理的中间件前,它们仍处理 next.Invoke 语句后面的代码。

二、中间件的顺序

下图显示了 ASP.NET Core MVC 和 Razor Pages 应用的完整请求处理管道。 你可以在典型应用中了解现有中间件的顺序,以及在哪里添加自定义中间件。 你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件。

1682583987423

上图中的“终结点”中间件为相应的应用类型(MVC 或 Razor Pages)执行筛选器管道。

上一个图中的件中。 这是通过显式调用 app.UseRouting 实现项目模板的顺序。 如果不调用 app.UseRouting,路由中间件将默认在管道开头运行。 如果你想要使用路由中间件来实现URL路径匹配,一定要记得在管道中添加 app.UseRouting方法来确保路由中间件被执行。

路由中间件

一般配置如下

    //首先使用 app.UseRouting() 中间件启用路由系统
    app.UseRouting();
    //然后使用 app.UseEndpoints() 中间件配置路由规则,并将请求映射到默认的控制器和操作方法。
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });

当使用 .UseEndpoints()方法来配置路由时,可以使用多种方式来实现路由配置。

下面是一些示例:

  1. 使用默认路由模板:
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

这将使用默认的路由模板来匹配控制器的操作方法。例如,如果有一个名为 ProductsController的控制器,并且其中有一个名为 GetProduct的操作方法,它将使用以下路由模板:/Products/GetProduct

  1. 自定义路由模板:
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "MyRoute",
        pattern: "my-route/{controller}/{action}/{id?}");
});

这将使用自定义的路由模板来匹配控制器的操作方法。在这个例子中,路由模板是 my-route/{controller}/{action}/{id?},其中 {controller}{action}{id}是占位符。这些占位符将被替换为相应的控制器、操作方法和参数。例如,如果有一个名为 ProductsController的控制器,并且其中有一个名为 GetProduct的操作方法,它将使用以下路由模板:my-route/Products/GetProduct

  1. 使用多个路由模板:
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "MyRoute1",
        pattern: "my-route1/{controller}/{action}/{id?}");

    endpoints.MapControllerRoute(
        name: "MyRoute2",
        pattern: "my-route2/{controller}/{action}/{id?}");
});

这将使用多个路由模板来匹配控制器的操作方法。在这个例子中,我们定义了两个路由模板:my-route1/{controller}/{action}/{id?}my-route2/{controller}/{action}/{id?}。这些路由模板将分别匹配不同的URL路径。

标签:请求,app,中间件,管道,路由,net6,模板
From: https://www.cnblogs.com/summerZoo/p/17462456.html

相关文章

  • 【跟小天学产品】第001期:国产化替代,中间件全系列产品对标揭秘
    【跟小天学产品】第001期:国产化替代,中间件全系列产品对标揭秘更新于2023-03-1613:57浏览数:552所属产品:中间件所属分类:【跟小天学产品】更多分类【跟小天学产品】【跟小天学产品】第001期 所属标签:精华汇总随着金融信创、央国企信创的全面深入,在进行国产化......
  • .Net6 调用qq邮箱发送邮件
    1.appsettings.json写入需要用到的基本信息 2.发送消息核心方法publicclassSendHelperl{privatereadonlyIConfiguration_configuration;publicSendHelperl(IConfigurationconfiguration){_configuration=configura......
  • RocketMQ:一个纯java的开源消息中间件--开发测试环境搭建
    一、简介  RocketMQ的前身是Metaq,当 Metaq 3.0发布时,产品名称改为RocketMQ    MetaQ2.x版本由于依赖了alibaba公司内部其他系统,对于公司外部用户使用不够友好,推荐使用3.0版本。   项目地址: https://github.com/alibaba/RocketMQ二、安装RocketMQ   安装Rocket......
  • 分布式事务的解决方案及中间件
    方案一:XA两阶段提交方案是一种比较重的操作,其中有有以下三个角色:事务管理器(TM)、事务协调者(TC)、资源管理器(RM),资源锁定时间长,效率低。方案二:TCC采用冻结预留的方式锁定资源,开发量较大,常用于资金交易类的场景。方案三:本地消息表严重依赖消息表来管理事务,并不适用高......
  • Asp.net core中间件实现原理及用法解说
    简述asp.netcore中间件的实现思路 一次http请求的过程,就是对一个Request请求进行若干次逻辑处理,并最终设置Response的过程。从代码的实现维度看,由于Request和Response都在HttpContext里,可将此过程表示为“以一个httpContext为输入的委托函数”,即delegateTaskRequestDelegate(Ht......
  • Asp.NetCore 自定义中间件
    这节演示一下自定义中间件,第一节我们讲到,中间件的处理流程就像一个俄罗斯套娃,那这种俄罗斯套娃型的流程内部是如何实现的呢,下面请看代码。    第一种写法是直接写在Configure方法中的,使用app.Use(委托)配合lambda表达式使用,适合很轻量级的中间件。app.Use(async(context,next......
  • Asp.NetCore Web应用程序中的请求管道和中间件
     你是否会迷惑当我们请求一个ASP.NetWeb应用程序以后,它是怎么处理这些请求的,后台是怎么工作的,今天就讲一下Asp.NetCoreWeb应用程序中的请求处理过程。    上一节,我们讲到,Startup文件中用来配置中间件(middleware),这个中间件就是用来处理请求的。那标题中的请求管道又是什么呢,......
  • 第四十八节:Core7.0中速率中间件详解
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • Golang Web--中间件的学习总结
    关于在golang中的中间件,可以翻阅笔者之前的博客,在这里不予详细说明。这里简单介绍下中间件的高级用法:1.如果每个路由分别要配置多个中间价,该如何处理2.如果有多个路由分别要配置多个中间件,该如何处理3.尝试不定义结构体开发中间件packagemainimport("context""......
  • .Net6添加Area域
      添加完成之后你的项目将会多出一个Area文件,同时vs会自动打开ScaffoldingReadMe.txt文件,把红框框内的内容复制到启动文件(ProGram.cs)中最后需要在你用到的视图或者控制器上加上Area标注 ......