1.Http请求处理流程

  当服务器接收到一个 Http请求的时候,IIS 首先需要决定如何去处理这个请求(NOTE:服务器处理一个.htm页面和一个.aspx页面肯定是不一样的么)。那IIS依据什么去处理呢?―― 根据文件的后缀名。
  服务器获取所请求的页面(NOTE:也可以是文件,比如 jimmy.jpg)的后缀名以后,接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,并且这个文件也没有受到服务器端的保护(NOTE:一个受保护的例子就是 App_Code中的文件,一个不受保护的例子就是你的js脚本),那么IIS将直接把这个文件返还给客户端。
  能够处理各种后缀名的应用程序,通常被称为 ISAPI 应用程序(NOTE:Internet Server Application Programe Interface,互联网服务器应用程序接口)。虽然这 ISAPI 听上去还挺气派,也算是“应用程序”呢,但仔细看看它的全称就明白了:它实际上只是一个接口,起到一个代理的作用,它的主要工作是映射所请求的页面(文件) 和与此后缀名相对应的实际的处理程序。

2.理解宿主环境(Hosting)
从本质上讲,Asp.Net 主要是由一系列的类组成,这些类的主要目的就是将Http请求转变为对客户端的响应。HttpRuntime类是Asp.Net的一个主要入口,它有一个称作 ProcessRequest 的方法,这个方法以一个 HttpWorkerRequest 类作为参数。HttpRuntime 类几乎包含着关于单个 Http请求的所有信息:所请求的文件、服务器端变量、QueryString、Http 头信息 等等。Asp.Net 使用这些信息来加载、运行正确的文件,并且将这个请求转换到输出流中,一般来说,也就是HTML页面。
NOTE:二般来说,也可以是张图片。
  当 Web.config文件的内容发生改变 或者 .aspx文件发生变动的时候,为了能够卸载运行在同一个进程中的应用程序(NOTE:卸载也是为了重新加载),Http请求被分放在相互隔离的应用程序域中。
NOTE:可能你以前就听过应用程序域,但是不了解怎么回事,应用程序域就是 AppDomain。
  对于IIS来说,它依赖一个叫做 HTTP.SYS 的内置驱动程序来监听来自外部的 HTTP请求。在操作系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径。
NOTE:实际上相当于告诉HTTP.SYS哪些URL是可以访问的,哪些是不可以访问的。举个简单的例子:为什么你访问不存在的文件会出现 404 错误呢?就是在这一步确定的。
  如果请求的是一个可访问的URL,HTTP.SYS会将这个请求交给 IIS 工作者进程。
NOTE:IIS6.0中叫做 w3wp.exe,IIS5.0中叫做 aspnet_wp.exe。
  每个工作者进程都有一个身份标识 以及 一系列的可选性能参数。
NOTE:可选性能参数,是指诸如 回收机制的设置、超时时间设置 等等。
  接下来进行的事情就是上一章节讲述的 ISAPI 了。
NOTE:这部分的内容相关性比较强,为了让大家好理解,我最后还是决定把 ISAPI 放到前面了,可能全系列完成的时候会再调整吧。
  除了映射文件与其对应的处理程序以外,ISAPI 还需要做一些其他的工作:

从HTTP.SYS中获取当前的Http请求信息,并且将这些信息保存到 HttpWorkerRequest 类中。
在相互隔离的应用程序域AppDomain中加载HttpRuntime。
调用 HttpRuntime的ProcessRequest方法。
  接下来才是程序员通常编写的代码所完成的工作了,然后,IIS 接收返回的数据流,并重新返还给 HTTP.SYS,最后,HTTP.SYS 再将这些数据返回给客户端浏览器。
2.理解 Http 管道

  当Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(NOTE:Managed Modules)和处理程序(NOTE:Handlers)组成,并且由管道来处理这个 Http请求。
  1. HttpRuntime将Http请求转交给 HttpApplication,HttpApplication代表着程序员创建的Web应用程序。HttpApplication创建针对此Http请求的 HttpContext对象,这些对象包含了关于此请求的诸多其他对象,主要是HttpRequest、HttpResponse、HttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。、
  2. 接下来Http请求通过一系列Module,这些Module对Http请求具有完全的控制权。这些Module可以做一些执行某个实际工作前的事情。
  3. Http请求经过所有的Module之后,它会被HttpHandler处理。在这一步,执行实际的一些操作,通常也就是.aspx页面所完成的业务逻辑。可能你会觉得在创建.aspx页面并没有体会到这一过程,但是,你一定知道,.aspx 页面继承自Page类,我们看一下Page类的签名:
public class Page : TemplateControl, IHttpHandler{
// 代码省略
}
可以看到,Page类实现了IHttpHandler接口,HttpHandler也是Http请求处理的最底层。
  4.HttpHandler处理完以后,Http请求再一次回到Module,此时Module可以做一些某个工作已经完成了之后的事情。
NOTE:注意我用红色标识的字,然后回想一下:Asp.Net 中是不是有众多的 Inserting 、Inserted 之类成对的事件?其实,这里讲述的就是为什么Asp.Net可以将一个Insert操作分成前后两部分,然后再分别进行事件拦截的幕后原理。
  如果我们将注意力只集中在Http请求、HttpHandler和HttpModule上,不去考虑HttpContext和HttpApplication,那么图4.可以简化成下面这样:
图5.Http请求在HttpHandler 和 HttpModule 中的流动方向

MVC5管道处理模型相关推荐

  1. 管道( Pipeline )模型--示例

    类图 时序图 阀门接口 /*** 阀门接口* @author administrator**/ public interface Valve {public String getName();publ ...

  2. ASP.NET使用管道模型(PipleLines)处理HTTP请求

    大多数人认为ASP.NET仅仅只是页面--使用模板来创建HTML页面然后返回给浏览器.但是这仅仅只是ASP.NET使用HTTP管道模型处理WEB程序很小的一方面.管道模型是类似于Web Service ...

  3. [Asp.net MVC]Asp.net MVC5系列——添加数据

    目录 概述 显示添加数据时所用表单 处理HTTP-POST 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列--第一个项目 [Asp.net MVC]Asp.net MVC5系列 ...

  4. FAIR发布两大更新:PyTorch1.8和一个10亿参数自监督模型,自监督也学GPT-3套路?

    2021-03-05 19:38:58 作者 | 青暮 今天,FAIR发布了两项重要更新,分别是PyTorch 1.8以及10亿参数自监督模型SEER. 根据官方推特,此次更新重点包括:编译器更新.代 ...

  5. 六条规则让你的ML模型部署的更快

    双语原文:六点规则让你的ML模型部署的更快 英语原文:Six Rules for Deploying your Machine Learning Models Faster 翻译:雷锋字幕组(yhfw ...

  6. Apache Spark 2.0预览: 机器学习模型持久化

    在即将发布的Apache Spark 2.0中将会提供机器学习模型持久化能力.机器学习模型持久化(机器学习模型的保存和加载)使得以下三类机器学习场景变得容易: \\ 数据科学家开发ML模型并移交给工程 ...

  7. Linux下进程间通信方式之管道、信号、共享内存、消息队列、信号量、套接字

    /* 1,进程间通信 (IPC ) Inter-Process Communication比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息.2,linux下IPC机制的分类:管道.信号. ...

  8. linux内核剖析(八)进程间通信之-管道

    管道 管道是一种两个进程间进行单向通信的机制. 因为管道传递数据的单向性,管道又称为半双工管道. 管道的这一特点决定了器使用的局限性.管道是Linux支持的最初Unix IPC形式之一,具有以下特点: ...

  9. Linux进程间通信——管道

    转自:http://www.cnblogs.com/feisky/archive/2010/03/24/1693484.html Linux进程间通信机制: 1.同一主机进程间通信机制: Unix方式 ...

最新文章

  1. j.u.c.locks.AbstractQueuedSynchronizer.Node
  2. cic曲线是什么_贝塞尔曲线基本用法
  3. 借助C/C++进行Android开发:NDK的配置与使用
  4. 开发日记-20190828 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 4
  5. CSS 高级布局技巧
  6. 对于初学者学习Java语言的建议(转载)
  7. mysql as_mysql AS子句
  8. CentOS安装rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
  9. 有法院被执行人记录还能贷款吗?
  10. usb3.0 linux无法识别,USB3.0接口不能识别U盘的解决方法
  11. 【2016年第4期】分布式协商:建立稳固分布式 大数据系统的基石
  12. TensorFlow安装中遇到的问题
  13. NodeJs(尚硅谷视频学习笔记)
  14. 通信行业最齐全的英语缩语手册
  15. PHP + Apache + Mysql集成环境部署及简要教程
  16. 各大快递公司面单号准确性验证的正则表达式
  17. centos7下搭建lnmp环境包含yum源直接安装和源码编译安装,以及php5.3和php7.6版本
  18. (六)分布式系统认证方案
  19. 安卓开发中的 “Android高手” ,需要具备哪些技术?
  20. 一句话木马、中国菜刀、图片一句话制作、过狗一句话

热门文章

  1. QT实现3D多个视口渲染场景。
  2. QT的QDesignerCustomWidgetInterface类的使用
  3. 二维数组离散程度matlab,(十八)数据分析中的一些概念
  4. Oracle导入到不同的角色,oracle 不同版本之间的导入导出
  5. redis的基本使用笔记二
  6. 2.4-2.5、Hive整合(整合Spark、整合Hbase)、连接方式Cli、HiveServer和hivemetastore、Squirrel SQL Client等
  7. Docker容器间通讯,直接路由方式实现网络通讯
  8. maven之build resources resource 详细介绍
  9. Mysql 8 group replication组复制集群单主配置图解
  10. Python mat与array的区别