asp.net core 管道

Use 扩展方法是用于将中间件代码添加到其他空管道工作流的主要方法。注意,添加的中间件越多,服务器需要执行更多的工作来满足任何传入请求。最小的是管道,最快的是客户端至第一字节的时间 (TTFB)。

可以使用 lambads或临时中间件类向管道添加中间件代码,

 图 2 ASP.NET Core 运行时管道

每个中间件组件都有两次机会介入正在进行的请求的生命周期,它可以预先处理从之前注册运行的组件链收到请求,然后它会被链中的下一个组件取代。

当链中的最后一个组件有机会预先处理请求时,请求会被传递给终止中间件,以便进行实际处理,目的是生成具体输出。之后,组件链按相反顺序返回,每个中间件都有第二次处理的机会-不过,这一次将是后处理操作,预处理代码与后处理代码的分割线为:

await nextMiddleware();

终止中间件

在图2所示的体系结构中,关键是终止中间件的角色,它是Configure方法底部的代码,用于终止链并处理请求。所有演示ASP.NET Core应用程序都有一个终止的lambad,如下所示:

app.Run(async (context) => {...});

lambda 接收HttpContext对象,并在应用程序上下文中执行它应执行的任何操作。

UseStaticFiles中间件就是一个很好的例子,它在指定的web根文件夹下提供静态资源,并终止请求。另一个是UseRewriter,它可以命令客户端重定向到新的URL。在没有终止中间件的情况下,请求很难在客户端上产生一些可见的输出,尽管响应仍然通过运行中间件(例如,通过http标头或响应cookie)以修改后的形式发送。

还有两个专用的中间件工具也可以用于短路请求:app.Map和app.MapWhen。前者检查路径是否匹配参数并运行自己的终止中间件,如下所示:

app.Map("/now", now =>
{
  now.Run(async context =>
  {
    var time = DateTime.UtcNow.ToString("HH:mm:ss");
    await context
      .Response
      .WriteAsync(time);
  });
});

public void Configure(IApplicationBuilder app,
                      ICountryRepository country)
{
  app.Map("/country", countryApp =>
  {
    countryApp.Run(async (context) =>
    {
      var query = context.Request.Query["q"];
      var list = country.AllBy(query).ToList();
      var json = JsonConvert.SerializeObject(list);
      await context.Response.WriteAsync(json);
    });
  });
  // Work as a catch-all
  app.Run(async (context) =>
  {
    await context.Response.WriteAsync("Invalid call");
  }
});

 

 

posted @ 2024-02-27 11:30  每天学习一点哈哈哈  阅读(31)  评论(0编辑  收藏  举报