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");
}
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)