转载--【笔记】Asp.Net构架(Http请求处理流程)

转载--【笔记】Asp.Net构架(Http请求处理流程)

最近接触了一些Asp.Net开发人员,在聊到技术的时候,发现很多的Asp.Net开发人员都不明白在ASP.NET中一个页面请求的处理流程,今天自己在反思的过程中,发现我自己对这个也是一知半解,于是抽时间又拜读了一次张子阳同学的文章。读罢,记录一部份重要的在自己的博客。

Http请求刚刚到达服务器的时候

当服务器接收到一个 Http请求的时候,IIS 首先需要决定如何去处理这个请求(NOTE:服务器处理一个.htm页面和一个.aspx页面肯定是不一样的么)。那IIS依据什么去处理呢?―― 根据文件的后缀名。

服务器获取所请求的页面(NOTE:也可以是文件,比如 jimmy.jpg)的后缀名以后,接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,并且这个文件也没有受到服务器端的保护(NOTE:一个受保护的例子就是 App_Code中的文件,一个不受保护的例子就是你的js脚本),那么IIS将直接把这个文件返还给客户端。

能够处理各种后缀名的应用程序,通常被称为 ISAPI 应用程序(NOTE:Internet Server Application Programe Interface,互联网服务器应用程序接口)。虽然这 ISAPI 听上去还挺气派,也算是“应用程序”呢,但仔细看看它的全称就明白了:它实际上只是一个接口,起到一个代理的作用,它的主要工作是映射所请求的页面(文件)  和与此后缀名相对应的实际的处理程序。

让我们更进一步地看一下 ISAPI ,看看它到底是什么样子,请按下面的步骤进行:

  1. 打开IIS。
  2. 选择随意一个站点,鼠标右键,“属性”。
  3. 选择“主目录”选项卡。
  4. 选择“配置”。

你应该会看到如下的画面:

图1. 应用程序配置

很清楚地就可以看到,所有IIS所能处理,或者叫 ISAPI 所提供代理服务的 文件类型 及其相对应的实际的后台处理程序都在这里清楚地列出来了。

我们找到 .aspx 的应用处理程序,然后点“编辑”,会出现下面的画面:

图2. 编辑.aspx文件的处理程序

一路看到这里,可以看出,所有的.aspx文件实际上都是由 aspnet_isapi.dll 这个程序来处理的,当IIS把对于.aspx页面的请求提交给了aspnet_isapi.dll以后,它就不再关心这个请求随后是如何处理的了。现在我们应该知道:Asp.Net 只是服务器(IIS)的一个组成部分而已,它是一个 ISAPI扩展。

这里需要注意两点:

  • 当你修改“限制为”后,可以限制页面(文件)只能以某种特定方式访问
  • “确认文件是否存在”是实现 URL 地址映射的关键选项,我以后会专门讲述。
理解宿主环境(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 了。

除了映射文件与其对应的处理程序以外,ISAPI 还需要做一些其他的工作:

  1. 从HTTP.SYS中获取当前的Http请求信息,并且将这些信息保存到 HttpWorkerRequest 类中。
  2. 在相互隔离的应用程序域AppDomain中加载HttpRuntime。
  3. 调用 HttpRuntime的ProcessRequest方法。

接下来才是程序员通常编写的代码所完成的工作了,然后,IIS 接收返回的数据流,并重新返还给 HTTP.SYS,最后,HTTP.SYS 再将这些数据返回给客户端浏览器。

图3.Asp.Net 的宿主环境

理解管道(Pipeline)

在前面两章中,我们在一个相对比较低的层次上讨论了从发出Http请求到看到浏览器输出这转瞬即逝的十分之一秒内IIS和 Framework 所做的事情。但是我们忽略了一个细节:程序员编写的代码是如何在这一过程中衔接的,本章我们就来看看这个问题。

当Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(NOTE:Managed Modules)和处理程序(NOTE:Handlers)组成,并且由管道来处理这个 Http请求。

图4. 理解 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 中的流动方向

posted on 2009-05-06 17:50 ecmascript 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/ecmascript/archive/2009/05/06/1450864.html

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

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

相关文章

语法分析器c语言 递归子程序,RecursiveSubroutine

RecursiveSubroutine介绍编译原理语法分析——递归下降子程序类,C实现。实验说明一、实验目标分别采用自顶向下和自底向上两种语法分析方法,编制一个语法分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析实验内容。二、实验…

SSL/TLS协议运行机制的概述

互联网的通信安全,建立在SSL/TLS协议之上。 本文简要介绍SSL/TLS协议的运行机制。文章的重点是设计思想和运行过程,不涉及具体的实现细节。如果想了解这方面的内容,请参阅RFC文档。 一、作用 不使用SSL/TLS的HTTP通信,就是不加密的…

margin塌陷

一:什么是margin塌陷 在标准文档流中,竖直方向的margin会出现叠加现象(水平方向不会塌陷),两个margin紧挨着,中间没有border或者paddingmargin直接接触,就产生了合并表现为较大的margin会覆盖掉…

c语言幼儿园管理系统,【资源学习】c语言程序代码,登录幼儿园200个小朋友的数据...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼编写程序,登录幼儿园200个小朋友的数据:姓名、性别、年龄、身高、体重、出生日期,分别按年龄排序后输出。要求:(1)登录数据用函数input()(2)按身高排序用函数sort()(3)输出排序结果用…

[转载]EXT核心API详解(一)-Ext

Ext类addBehaviors( Object obj ) : void对选择的元素 应用事件侦听器,事件名以附加在结尾,例如addBehaviors({// idfoo下所有的a标签加入click事件#foo aclick : function(e, t){// do something},// 用,分隔多个选择器#foo a, #bar span.some-classmouseover : function(){//…

Redis链表实现

链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层实现。除了链表键之外, …

获取当前日期0点及23点59的时间戳

1.获取今天0点时间戳: const start new Date(new Date(new Date().toLocaleDateString()).getTime()); //如果不是当天换成你想获取0点的时间即可。 console.log(start); 2.获取今天23:59:59点时间戳: const start new Date(new Date(new Date(…

android 6.0 api 管理,Android 6.0(API23)权限申请问题

1.在API23以上,不止要在AndroidManifest.xml里面添加权限2.还要在JAVA代码中请求权限:// Storage Permissionsprivate static final int REQUEST_EXTERNAL_STORAGE 1;private static String[] PERMISSIONS_STORAGE {Manifest.permission.READ_EXTERNAL…

ecos内核概览--bakayi译

http://blog.csdn.net/wangzaiwei2006/article/details/6453423

linux optimizer,linux命令1—安装optimizer(示例代码)

ZendChina官方:下面介绍一下关于在linux环境下Zend Optimizer 3.3的安装方法。本篇文章是基于RHEL5架构的linux系统。(1)ZendOptimizer 3.3.3版本的安装。ZendOptimizer 3.3.3下载地址:安装:# wget http://down1.chinaunix.net/distfiles/Zen…

python 多进程与多线程配合拷贝文件目录

版本一:使用shutil进行拷贝 1 # -*- coding: utf-8 -*-2 # author: Tele3 # Time : 2019/04/02 下午 3:094 # 待改进:5 # 1.拷贝逻辑使用原生的io6 # 2.针对大文件在进程内部实现多线程方式进行拷贝7 8 9 import time10 import re11 import os12 import shutil13 import multi…

水晶报表加载失败的解决方法

问题描述:利用水晶报表开发的程序在运行了一段时间后,加载水晶报表失败.问题解决1.这个问题可能是由于windows临时文件夹下面的水晶报表文件没有及时清除的原因.打开临时文件夹,删除后就可以正常运行.2. (1).ReportDocumen实例必须为类成员 private ReportDocument prtp ne…

重定向

servlet的两种重定向方法的区别及应用一 问题&#xff1a; 在servlet/JSP编程学习中,发现有两种方法可以实现服务端输出重定向&#xff0c;一种是通过forward方法&#xff08;例如JSP中 的<jsp:forward page”OtherPage.jsp”/>&#xff09;&#xff0c;另一种则是通过运…

移动端事件

1. click事件 单击事件&#xff0c;类似于PC端的click&#xff0c;但在移动端中&#xff0c;连续click的触发有200ms ~ 300ms的延迟 2. touch类事件 触摸事件&#xff0c;有touchstart touchmove touchend touchcancel 四种之分 touchstart&#xff1a;手指触摸到屏幕会触发 to…

LINQ to SharePoint 试用感受, 欢迎讨论~

目前项目需要比较复杂的查询功能&#xff0c; 如果直接写CAML的话以后维护非常麻烦&#xff0c; 然后暂时用LINQ to SharePoint替代之&#xff5e; URL&#xff1a; http://linqtosharepoint.codeplex.com/ 最大的优点是我不用写CAML了&#xff0c; 非常容易实现一些简单的查询…

android应用退出后广播无效,关闭应用程序后,保持广播接收器运行

我认为接受的答案不是实际答案。我将解释问题所在。我认为您是在Huawie&#xff0c;Oppo&#xff0c;Vivo&#xff0c;Xiomi&#xff0c;asus .......或某些设备上测试您的应用程序。使用这些设备&#xff0c;如果我们关闭应用程序&#xff0c;它们还将关闭我们的广播接收器。因…

数据库SQL,技巧篇

三、技巧1、11&#xff0c;12的使用&#xff0c;在SQL语句组合时用的较多“where 11” 是表示选择全部 “where 12”全部不选&#xff0c;如&#xff1a;if strWhere ! beginset strSQL select count(*) as Total from [ tblName ] where strWhere endelse beginset st…

走过小公司的坑之入职一周

第一天工作内容&#xff0c;电脑系统安装&#xff0c;软件环境部署&#xff0c;出现硬盘坏道问题及病毒 第二天工作内容&#xff0c;web基础模型搭建&#xff0c;解决软件版本兼容问题 第三天工作内容&#xff0c;承接项目&#xff0c; 项目背景&#xff1a;web进销存系统&…

ps4移植android游戏,把PS4游戏《Apex英雄》《只狼》搬到安卓手机上玩,这招够简单!...

近期&#xff0c;索尼抢先其他平台&#xff0c;在PlayStaion官方网站发布新信息&#xff0c;使各大主流射击游戏平均流失率达到57%的大逃杀游戏《Apex英雄》&#xff0c;本赛季会加入两名新角色&#xff0c;一位是刚更新的辛烷&#xff0c;另一位会在本赛季结束前推出。根据此前…

指挥家和他的理解

最近翻出了电脑硬盘中的MP3&#xff0c;无意间找到了上大学音乐选修课时为考试准备的一些古典音乐的MP3&#xff0c;其中有一个文件夹中的文件都是Beethoven的 音乐。遂考到MP3中找些时间慢慢听。逐渐&#xff0c;发现自己开始喜欢上了古典交响乐&#xff0c;尤其是Beethoven的…