博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程...
阅读量:4582 次
发布时间:2019-06-09

本文共 2309 字,大约阅读时间需要 7 分钟。

从《》我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很少人能够地把它弄清楚。如果想非常深刻地认识ASP.NET Core的请求处理管道,可以分两个步骤来进行,我们首先可以在忽略细节的前提下搞清楚管道处理HTTP请求的总体流程,然后再此基础上补充之前遗漏的细节。为了让读者朋友们能够更加容易地理解管道处理HTTP请求的总体流程,我们根据真实管道的实现原理再造了一个“模拟管道”。[模拟管道以及建立在它之上的图片发布应用源代码从下载]

对于我们再造的迷你版本的管道,它不仅仅体现了真实管道中处理HTTP请求的流程,对于其中涉及的接口和类型,我们基本上采用了相同的命名。但是为了避免很多“细枝末节”对我们的理解造成干扰,我们会进行最大限度的裁剪。对于大部分方法,我们只会保留最核心的逻辑;对于一些接口,我们设置会提出掉一些与核心流程无关的成员。在通过这个模拟的管道讲解HTTP请求的总体处理流程之前,我们先来看看如何在它基础上开发一个简单的应用。

我们在这个模拟管道上开发一个简单的应用来发布图片。具体的应用场景是这样:我们将图片文件保存在服务器上的某个目录下,客户端可以通过发送HTTP请求并在请求地址上指定文件名的方式来获取目标图片。如右图所示,我们利用浏览器向针对某张图片的地址(“http://localhost:3721/girl”)发送请求后,获取到的目标图片(girl.jpg)会直接显示到浏览器上。

由于我们模拟的管道采用与真实管道一致的API,所以两种采用的编程模式也是一致的。对于这个用于发布图片的应用来说,它也和我们上面演示的Hello World程序一样有两个基本的类型构成。一个是定义了入口Main方法的Program,另一个则是作为启动类型的Startup。

1: class Program
2: {
3:     static void Main(string[] args)
4:     {
5:         new WebHostBuilder()
6:             .UseServer(new HttpListenerServerFactory("http://localhost:3721/"))
7:             .UseStartup(typeof(Startup))
8:             .Build()
9:             .Start();
10:     }
11: }
12: 
13: public class Startup
14: {
15:     public void Configure(IApplicationBuilder app)
16:     {
17:         app.UseImages(@"c:\images");
18:     }
19: }

如上面的代码片断所示,我们在Main方法中创建了一个WebHostBuilder对象,在调用其Build方法创建应用宿主的WebHost之前,我们调用其UseServer方法注册了一个用于创建服务器的HttpListenerServerFactory对象。HttpListenerServerFactory对象用于创建一个名为HttpListenerServer的服务器,这是我们自己定义的服务器,它利用一个HttpListener对象实现了针对HTTP请求的监听、接收和最终的响应。HttpListenerServerFactory构造函数指定的HttpListener的监听地址。

在完成了服务器注册之后,我们调用UseStartup方法将Startup作为启动类型。通过上面的介绍我们知道,启动类型的目的在于通过注册相应中间件的方式对构建的管道进行定制。对于我们演示的这个应用来说,管道对HTTP请求的处理体现在如何根据请求地址解析出对应图片的文件路径,并将文件的内容作为请求的响应。完成这项操作的中间件是通过调用我们自定义的扩展方法UseImages进行注册的,该方法的参数表示存放图片的目录(c:\images)。

总的来说,请求处理管道涉及到四个核心的对象,它们分别是WebHostBuilder、WebHost、Server和HttpApplication,它们之间具有如右图所示的关系。我们通过WebHostBuilder来创建WebHost,并领用后者来构建请求处理管道。 请求处理管道通过一个Server和一个HttpApplication对象组成,后者是对所有注册的中间件的封装。当WebHost被启动的时候,它会创建Server和HttpApplication对象,并将后者作为参数调用Server的Start方法以启动服务器。启动后的Server开启监听请求并利用HttpApplication来处理接收到请求。当HttpApplication完成了所有请求处理工作之后,它会利用Server完成对请求的最终响应。

我们将在后续的两篇文章对模拟管道的设计和实现作详细介绍,相信读者朋友们据此可以对实现在ASP.NET Core管道中的请求处理流程以及管道自身的创建流程有一个深刻的认识,如果大家对此有兴趣,敬请关注本系列后续文章。


一、

二、
四、

转载于:https://www.cnblogs.com/artech/p/mini-asp-net-core-pipeline.html

你可能感兴趣的文章
ASP.NET运行原理
查看>>
造成win2008 500内部错误不能显示详细错误的原因和解决方法
查看>>
个人项目初始版本李昂
查看>>
iOS沙盒路径变化的说明详解
查看>>
Java-异常Throwable,Exception,Error
查看>>
梦殇 chapter three
查看>>
QT QDialog如何弹出一个子窗口
查看>>
全排列递归算法
查看>>
mysql中engine=innodb和engine=myisam的区别
查看>>
springboot jpa junit测试遇到的问题
查看>>
(转)不停止Nginx服务的情况下平滑变更Nginx配置
查看>>
[markdown] Markdown 简要语法
查看>>
SynchronizedMap和ConcurrentHashMap同步方式比较
查看>>
[转载]什么是ORM及为什么要使用ORM
查看>>
Gym - 101982D (数位dp)
查看>>
个人中心标签页导航
查看>>
使用 UMeng 实现第三方QQ登录
查看>>
MongoDB简介
查看>>
微信小程序中 不点击picker 点击一个button 怎么调用picker 弹出选择框
查看>>
LNMP
查看>>