返回首页

asp.net管道中四大类是什么

61 2023-11-12 06:02 admin    手机版

我们所说的ApplicationBuilder是对所有实现了IApplicationBuilder接口的所有类型及其对象的统称。注册到WebHostBuilder上的启动类型具有一个用于管道定值的Configure方法,它利用作为参数的ApplicationBuilder对象进行中间件的注册。由于ApplicationBuilder与组成管道的中间件具有直接的关系,所以我们得先来说说中间件在管道中究竟体现为一个怎样的对象。

中间件在请求处理流程中体现为一个类型为Func的委托对象,对于很多刚刚接触请求处理管道的读者朋友们来说,可能一开始对此有点难以理解,所以容来略作解释。我们上面已经提到过RequestDelegate这么一个委托,它相当于一个Func对象,该委托对象表示针对提供的HttpContext所做进行一项处理操作,这项操作代表某个中间件针对请求的处理。那为何我们不直接用一个RequestDelegate对象来表示一个中间件,而将它表示成一个Func对象呢? 在大部分应用中,我们会针对具体的请求处理需求注册多个不同的中间件,这些中间件按照注册时间的先后顺序进行排列进而构成我们所谓的请求处理管道。对于某个中间件来说,在它完成了自身的请求处理任务之后,需要将请求传递给下一个中间件作后续的处理。Func中作为输入参数的RequestDelegate对象代表一个委托链,体现了后续中间件对请求的处理,当前中间件将自身实现的请求处理任务添加到这个委托链中,而返回RequestDelegate对象代表最新的委托链。 以右图所示的管道为例,如果用一个Func来表示中间件B,那么作为输入参数的RequestDelegate对象代表的是C对请求的处理操作,而返回值则代表B和C先后对请求处的处理操作。如果一个Func代表第一个从服务器接收请求的中间件(比如A),那么执行该委托对象返回的RequestDelegate实际上体现了整个管道对请求的处理。 在对中间件有了充分的了解之后,我们来看看用于注册中间件的IApplicationBuilder接口的定义。如下所示的是经过裁剪后的IApplicationBuilder接口的定义,我们只保留了两个核心的方法,其中Use方法实现了针对中间件的注册,另一个Build方法则将所有注册的中间件转换成一个RequestDelegate对象。 1: public interface IApplicationBuilder 2: { 3: RequestDelegate Build(); 4: IApplicationBuilder Use(Func middleware); 5: } 从编程便利性考虑,很多预定义的中间件都具有用于注册的扩展方法,比如我们调用扩展方法UseStaticFiles来注册处理静态文件请求的中间件。对于我们演示的发布图片的应用来说,它也是通过调用一个具有如下定义的扩展方法UseImages来注册处理图片请求的中间件。 1: public static class ApplicationBuilderExtensions 2: { 3: public static IApplicationBuilder UseImages(this IApplicationBuilder app, string directory) 4: { 5: Func middleware = next => 6: { 7: return context => 8: { 9: string fileName = context.Request.Url.LocalPath.TrimStart('/'); 10: if (string.IsNullOrEmpty(Path.GetExtension(fileName))) 11: { 12: fileName += .jpg; 13: } 14: fileName = Path.Combine(directory, fileName); 15: context.Response.WriteFile(fileName, image/jpg); 16: return next(context); 17: }; 18: }; 19: return app.Use(middleware); 20: } 21: } ASP.NET Core默认使用的是一个类型为ApplicationBuilder的对象来注册中间件,我们采用如下的代码片断来模拟它的实现逻辑。我们采用一个List>对象来存放所有注册的中间件,并调用Aggregate方法将它转换成一个RequestDelegate对象。 1: public class ApplicationBuilder : IApplicationBuilder 2: { 3: private IList> middlewares = new List>(); 4: 5: public RequestDelegate Build() 6: { 7: RequestDelegate seed = context => Task.Run(() => {}); 8: return middlewares.Reverse().Aggregate(seed, (next, current) => current(next)); 9: } 10: 11: public IApplicationBuilder Use(Func middleware) 12: { 13: middlewares.Add(middleware); 14: return this; 15: } 16: } ASP.NET Core并不会直接创建ApplicationBuilder对象来注册中间件,而是利用对应的工厂来创建它。创建爱你ApplicationBuilder的工厂通过接口IApplicationBuilderFactory表示,在模拟的管道中我们将这个接口简化成如下的形式,该接口的默认实现者ApplicationBuilderFactory会直接创建一个ApplicationBuilder类型的对象。 1: public interface IApplicationBuilderFactory 2: { 3: IApplicationBuilder CreateBuilder(); 4: } 5: 6: public class ApplicationBuilderFactory : IApplicationBuilderFactory 7: { 8: public IApplicationBuilder CreateBuilder() 9: { 10: return new ApplicationBuilder(); 11: } 12: }

顶一下
(0)
0%
踩一下
(0)
0%
相关评论
我要评论
用户名: 验证码:点击我更换图片