找回密码
 立即注册
快捷导航

[.NET] Map、MapWhen、Use、UseWhen、Endpoint、Run 请求处理管道

[复制链接]
seek 2023-10-17 20:09:59 | 显示全部楼层
本帖最后由 seek 于 2023-10-17 20:32 编辑

Map:配置一个请求路径的路由映射,并将该路径下的请求路由到指定的中间件或处理程序。它可以用于处理各种 HTTP 方法(GET、POST、PUT 等)的请求。

app.Map("/111", (app) =>
{
    // 配置处理程序
    // app.UseMiddleware<MyMiddleware>();

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

app.MapGet 方法是 app.Map 方法的一种特殊情况,专门用于处理 HTTP GET 方法的请求。

app.MapGet("/999", async context =>
{
    var processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
    await context.Response.WriteAsync(processName);
});

MapWhen 方法接受一个谓词参数,用于定义路由匹配的条件。即 用于根据自定义的谓词条件来配置路由映射。它可以根据请求的上下文信息(例如路径、方法、标头等)来决定是否应用指定的处理程序。

在下列示例中,使用 context.Request.Path == "/path" 作为谓词,表示只有当请求的路径为 "/path" 时,才会执行后续的逻辑。

app.MapWhen(context => context.Request.Path == "/123", app =>
{
    app.Run(async context =>
    {
        await context.Response.WriteAsync("Hello, specified string!");
    });
});

Use 用于添加中间件到请求处理管道中。

app.Use((context, next) =>   // 调用Use方法添加中间件到请求处理管道中
{
    1
    // 中间件逻辑
    return next();
    2
});

app.Use(async (context, next) =>   // 调用Use方法添加中间件到请求处理管道中(异步)
{
    3
    // 中间件逻辑
    await next();
    4
});

执行顺序:1 → 3 → 4 → 2

Map、MapWhen、Use、UseWhen、Endpoint、Run 请求处理管道523 作者:seek 帖子ID:825

UseWhen:根据指定的条件来添加中间件到请求处理管道中(根据条件的结果决定是否执行中间件)。

app.UseWhen(context => context.Request.Query.ContainsKey("key"), (appBuilder) =>
{
    // 中间件逻辑
});

Endpoint:用于配置终结点,即路由到的处理程序或中间件。可以根据请求的谓词、路径和处理程序类型来配置终结点。

app.UseEndpoints(endpoints =>
{
    endpoints.MapGet("/path", async context =>
    {
        // 处理程序逻辑
        await context.Response.WriteAsync("Hello World!");
    });
});

Run:用于添加一个终结点到请求处理管道中。它是一种简化的方式,用于配置一个只有一个处理程序的终结点。

app.Run(async context =>  // 调用Run方法添加中间件到请求处理管道中
{
    // 处理程序逻辑
    await context.Response.WriteAsync("Hello World!");
});

Map、MapWhen、Use、UseWhen、Endpoint、Run 请求处理管道8224 作者:seek 帖子ID:825

回复

使用道具 举报

主题

0

回帖

285

积分

自成一派

 楼主| seek 2023-10-17 20:41:10 | 显示全部楼层

至关重要的自行顺序:

app.Use(async (context, next) =>
{
    app.Logger.LogInformation("MW1:传入请求");
    await next();
    app.Logger.LogInformation("MW1:传出响应");
});

app.Use(async (context, next) =>
{
    app.Logger.LogInformation("MW2:传入请求");
    await next();
    app.Logger.LogInformation("MW2:传出响应");
});
app.Run(async (context) =>
{
    await context.Response.WriteAsync("MW3:处理请求并生成响应");
    app.Logger.LogInformation("MW3:处理请求并生成响应");
});

info: MockSchoolManagement[0]
      MW1:传入请求
info: MockSchoolManagement[0]
      MW2:传入请求
info: MockSchoolManagement[0]
      MW3:处理请求并生成响应
info: MockSchoolManagement[0]
      MW2:传出响应
info: MockSchoolManagement[0]
      MW1:传出响应
   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
温馨提示

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

Archiver|手机版|小黑屋|DLSite

GMT+8, 2024-11-23 01:13

Powered by Discuz! X3.5 and PHP8

快速回复 返回顶部 返回列表