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");
}
});