ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程

从《ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求》我们知道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: }

clip_image002[10]如上面的代码片断所示,我们在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管道中的请求处理流程以及管道自身的创建流程有一个深刻的认识,如果大家对此有兴趣,敬请关注本系列后续文章。


一、采用管道处理HTTP请求
二、创建一个“迷你版”的管道来模拟真实管道请求处理流程
三、管道如何处理HTTP请求的
四、管道是如何被创建出来的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?

我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很少人能够地把它弄清楚。为了让读者朋友们能够更加容易地理解管道…

ASP.NET Core管道深度剖析(4):管道是如何建立起来的?

在《管道是如何处理HTTP请求的?》中,我们对ASP.NET Core的请求处理管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的。这样一个管道由一个服务器和一个HttpApplication构成&#xff0c…

ASP.NET MVC 入门1、简介

什么是MVC模式 MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式。它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器&#xf…

ASP.NET MVC 入门2、项目的目录结构与核心的DLL

我们新建一个ASP.NET MVC的Web Application后,默认的情况下,项目的目录结构如下: App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据。Content :这个目录是建议用来存放一下资源文件的。…

Maven超详细配置

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~🍗关注➕点赞➕评论➕收藏 😄🙏博主水平有限,如有错误,欢迎各位大佬纠正! 目录&#x1f…

ASP.NET MVC 入门3、Routing

本系列文章基于Microsoft ASP.NET MVC Beta. 在一个route中,通过在大括号中放一个占位符来定义( { and } )。当解析URL的时候,符号"/"和"."被作为一个定义符来解析,而定义符之间的值则匹配到占位符中。route定义中不在大…

一篇教你xftp连接阿里云轻量级应用服务器。超级详细,避免踩坑

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🍗关注➕点赞➕评论➕收藏 😄 🙏博主水平有限,如有错误,欢迎各位大佬纠正! &#x1f52…

ASP.NET MVC 入门4、Controller与Action

本系列文章基于ASP.NET MVC Preview5. Controller是MVC中比较重要的一部分。几乎所有的业务逻辑都是在这里进行处理的,并且从Model中取出数据。在ASP.NET MVC Preview5中,将原来的Controller类一分为二,分为了Controller类和ControllerBase类…

Postman下载与安装操作步骤【超详细】

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~🍗关注➕点赞➕评论➕收藏 😄🙏博主水平有限,如有错误,欢迎各位大佬纠正 Postman下载与安装&#x1…

C#异步编程模型

什么是异步编程模型 异步编程模型(Asynchronous Programming Model,简称APM)是C#1.1支持的一种实现异步操作的编程模型,虽然已经比较“古老”了,但是依然可以学习一下的。通过对APM的学习,我总结了以下三点: 1. APM的…

不会卸载MySQL?我连夜肝了一篇教你如何干干净净地卸载掉MySQL

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

设计模式篇

一. 什么是设计模式 纠结了好久,今天终于下定决心开始写设计模式系列,因为这个系列章节确实不好写,在这之前,也看了好多关于设计模式的博客、视频、书籍等,大多数用的例子要么猫啊狗啊、大雁等动物类;要么就…

Navicat15安装笔记

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🔎关注➕🤞点赞➕📋评论➕😄收藏 📅创作日期:2021年12月29日 📅修改日期…

MySQL5安装配置笔记【超详细】

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

IDEA常用快捷键大合集

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

KnockoutJs篇:快速掌握KnockoutJs

一、引言 之前这个系列文章已经介绍Bootstrap。由于最近项目中,前端是Asp.net MVC KnockoutJs Bootstrap来做的。所以我又重新开始写这个系列。今天就让我们来看看Web前端的MVVM框架——KnockoutJs。 二、KnockoutJs是什么? 做.NET开发的人应该都知道…

IDEA常用设置【很实用】

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

【git下载安装与配置】

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

git 连接gitee时报错 Auth error: Access deined: authorize failure

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

C#多线程编程系列(五)- 使用任务并行库

目录 1.1 简介1.2 创建任务1.3 使用任务执行基本的操作1.4 组合任务1.5 将APM模式转换为任务1.6 将EAP模式转换为任务1.7 实现取消选项1.8 处理任务中的异常1.9 并行运行任务1.10 使用TaskScheduler配置任务执行参考书籍笔者水平有限,如果错误欢迎各位批评指正&…