本文是自己查看源码后的个人总结,不保证其准确性。大家可作为参考。

浏览器和服务器之间的通信。

当敲一个域名到浏览器上面,然后回车的时候,如:http://www.baidu.com/index.aspx

浏览器会按照HTTP协议的语法生成相应的请求报文。

浏览器检查本机是否保存了http://www.baidu.com/index.aspx域名对应的服务器IP地址。如果没有,则发送请求到所在城市网中最近的DNS服务器(域名解析服务器),它会根据我们发送来的域名查询到该域名对应的服务器IP地址,并发送回浏览器。

浏览器DNS服务器获得了这个域名所对应的服务器电脑的IP然后在庞大的互联网中找到这个对应的服务器

HTTP协议规定服务器软件如(iis)使用的默认端口是80端口,也就是说浏览器默认的将HTTP请求报文发送到对应服务器的80端口。

服务器接受到浏览器发送到的HTTP请求报文(具体报文用httpwatcher查看)。

下面是发送到百度的请求报文:

服务器分析请求报文中的路径和文件名,在服务器找到这个文件。

如果是CSS和html,js,图片等文件就直接在服务器上面读取这个文件发送给浏览

器客户端。

下面是对ASP.NET动态页面的处理

当服务器IIS发现你请求的页面是动态页面,他发现他自己处理不了。

打开IIS,会发现里面有个处理程序映射

,也就是说IIS会将我们的.aspx后缀的文件交给对应的处理程序(aspnet_isapi.dll)。这里简称ISAPI。

ISAPI就会将请求交给.NET framework。

再有ISAPI将请求交给ASP.NET,也就是一个名为aspnet_wp.exe的工作进程aspnet_wp.exe就调用FrameWork里的类 ------- ISAPIRuntime。

下面是用反编译工具来分析的这个类ISAPIRuntime

看到这个方法,就会想到了垃圾回收。

其实这不是重点。重点是

这个processrequest方法

点击这个方法进去

首先会创建一个ISAPIWorkerRequest的对象wr,将请求报文封装到wr中

然后调用这个类的CreateWorkerRequest方法实例化这个对象

进入这个方法

这个方法会根据当前的IIS版本创建不同的对象

再回到ProcessRequest方法

接着就会调用HttpRuntime的ProcessRequestNoDemand方法。将wr传进去

进入这个方法

在这个方法的最后会调用

ProcessRequestNow方法。处理请求

这个方法有调用了另一个方法。进去

这里就会发现一个熟悉的东西,HttpContext(上下文对象)

这个方法会根据上面创建的ISAPIWorkerRequest对象wr(封装了请求报文)创建HttpContext。如果创建出错,就会返回一个400的错误。

判断是否是第一次请求之前

(如果是第一次请求,就设置当前的时间为第一次请求的起始时间。初始化第一次请求。设置第一次请求为false)

初始化Response.

当httpwriter为空的时候,就创建。可以看到,context.response中有2个写出器

一个是httpwriter,一个是textwriter

然后通过HttpApplicationFactory创建一个HttpApplication对象(此对象负责真正处理页面对象的创建和执行,先在httpapplication池中看又没有这个对象,没有就new一个)

下面打开HttpApplication这个类

在这里面最重要的就是这25个事件。其中有19个事件开放给我们使用。

1,BeginRequest

HTTP管道开始处理请求时,会触发BeginRequest事件

2-3,AuthenticateRequest,PostAuthenticateRequest

ASP.NET先后触发这两个事件,使安全模块对请求进行身份验证,。

4-5,AuthorizeRequest,PostAuthorizeRequest

ASP.NET先后触发这两个事件,使安全模块对请求进程授权

6-7,ResolveRequestCache,PostResolveRequestCache

ASP.NET先后触发这两个事件,以使缓存模块利用缓存的直接对请求直接进程响应(缓存模块可以将响应内容进程缓存,对于后续的请求,直接将缓存的内容返回,从而提高响应能力)。

8,PostMapRequestHandler

对于访问不同的资源类型,ASP.NET具有不同的HttpHandler对其进程处理。对于每个请求,ASP.NET会通过扩展名选择匹配相应的HttpHandler类型,成功匹配后,该实现被触发

9-10,AcquireRequestState,PostAcquireRequestState

ASP.NET先后触发这两个事件,使状态管理模块获取基于当前请求相应的状态,比如SessionState

11-12,PreRequestHandlerExecute,PostRequestHandlerExecute

ASP.NET最终通过一请求资源类型相对应的HttpHandler实现对请求的处理,在实行HttpHandler前后,这两个实现被先后触发

13-14,ReleaseRequestState,PostReleaseRequestState

ASP.NET先后触发这两个事件,使状态管理模块释放基于当前请求相应的状态

15-16,UpdateRequestCache,PostUpdateRequestCache

ASP.NET先后触发这两个事件,以使缓存模块将HttpHandler处理请求得到的相应保存到输出缓存中

17-18,LogRequest,PostLogRequest

ASP.NET先后触发这两个事件为当前请求进程日志记录

19,EndRequest

整个请求处理完成后,EndRequest事件被触发

在第8个事件创建被请求页面类的对象,并转换成Ihttphandler接口类对象。,

在9-10事件中会接受浏览器发送过来的sessionid,并且根据此值到服务器的session池中找到相对应的session对象,并将它赋值给页面类对象的session属性。

在第11到12事件之间执行页面类的processrequest方法。

下面是状态保持:session,cookie viewstate。写完状态保持再仔细将在11到12事件中具体做了什么事情

Cookie是保存在浏览器端的,cookie有两种状态,一种是保存在客户端电脑的内存中,当访问页面的时候创建的cookie(也就是没有设置过期时间的cookie)。还有一种是设置了过期时间为正的cookie,是保存在浏览器所对应的cookie文件夹中的。设置cookie前,浏览器发送请求到服务器,服务器要对该浏览器设置cookie,所以就发送一个cookie到浏览器,保存在客户端的内存或者硬盘中。当设置了cookie后,每次请求页面都会把cookie发送到服务器

服务器通过读取cookie得知你的相关信息然后进行相应的操作。

Session是依赖于cookie实现的。不同的是session是保存在服务器端的。

例如,当我们登陆的时候,服务器那边会给我们设置一个session保存在服务器端,然后会产生一个sessionid发送到浏览器端,浏览器这边存储这个sessionid,当你再请求别的页面的时候,浏览器就会将这个sessionid发送到服务器。,服务器根据从浏览器发送过来的sessionid自动从服务器的session池中找到与这个sessionid想对应的session对象并赋值给当前页面对象的session属性。

如果浏览器禁用了Cookie的话,那服务器也可以通过将sessionId保存在url中来完成sessionid在浏览器和服务器间的传递。(需要设置配置文件里的sessionState节点的 cookieless="autodetect")

<sessionState cookieless="AutoDetect"></sessionState>

Viewstate:页面的viewstate属性实际上就是获取了浏览器提交过来的一个名位__VIEWSTATE的隐藏域里面的值。

使用viewstate必须要有一个runat=“server”的表单

在页面类对象执行processrequest方法的时候,先创建控件树,然后通过执行loadstate方法,将请求报文中的名为__VIEWSTATE反base64编码然后进行序列化,最终还还原成集合,再将其中属于程序员自己添加的viewstate里面的键值对还原到页面对象的viewstate属性中,然后再执行page_load。,然后执行savestate将数据保存到viewstate属性中。

那么在第11到12之间中执行了页面类对象的processrequest方法,到底做了什么呢 。

1,  调用父类的processrequest方法,在此方法中父类调用父类的FrameworkInitialize()方法,但因为被页面类重写了,所以执行的是当前页面类的FrameworkInitialize()方法。在中间调用了_buildControlTree

2,  打造控件树

前台页面类。

前台页面类继承自后台页面类。

后台页面类继承自page

Templatecontrol继承自control

在coltrol类中

在中间有一个control集合

也就是说我们的前台页面类根据继承关系包含了一个控件集合。

再来到前台页面类。

,在最后面发现一个ProcessRequest方法。

,进去。

Bulidcontroltree开始打造控件树。

前台类继承后台类

litralControl包含html代码的第一段。

Htmlhead-htmltitle......

_BuildControlTree这个方法会将前台的所有代码封装起来,根据不同的标签封装成不同的控件对象。

3,  执行页面生命周期

1. Page_Init();
2. Load ViewState and Postback data;
3. Page_Load();
4. Handle control events;
5. Page_PreRender();
6. Page_Render();
7. Unload event;
8. Dispose method called;

阶段

说明

页请求

页请求发生在页生命周期开始之前。用户请求页时,ASP.NET 将确定是否需要分析和编译页(从而开始页的生命周期),或者是否可以在不运行页的情况下发送页的缓存版本以进行响应。

开始

在开始阶段,将设置页属性,如 Request 和 Response。在此阶段,页还将确定请求是回发请求还是新请求,并设置 IsPostBack 属性。此外,在开始阶段期间,还将设置页的 UICulture 属性。

页初始化

页初始化期间,可以使用页中的控件,并将设置每个控件的 UniqueID 属性。此外,任何主题都将应用于页。如果当前请求是回发请求,则回发数据尚未加载,并且控件属性值尚未还原为视图状态中的值。

加载

加载期间,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。

验证

在验证期间,将调用所有验证程序控件的 Validate 方法,此方法将设置各个验证程序控件和页的 IsValid 属性。

回发事件处理

如果请求是回发请求,则将调用所有事件处理程序。

呈现

在呈现之前,会针对该页和所有控件保存视图状态。在呈现阶段中,页会针对每个控件调用 Render 方法,它会提供一个文本编写器,用于将控件的输出写入页的 Response 属性的 OutputStream 中。

卸载

完全呈现页并已将页发送至客户端、准备丢弃该页后,将调用卸载。此时,将卸载页属性(如 Response 和 Request)并执行清理。

4,  调用页面类的Render方法生成html代码。

上面貌似很乱 。下面整理一下。

1,  浏览器请求一个动态页面。IIS发现自己不能处理,将请求转给映射表。

2,  映射程序里面aspx页面对应的是aspnet_isapi.dll,于是就将请求转给ISAPI

3,  请求报文通过ISAPIRuntime交给了HttpRuntime。

4,  在HttpRuntime里面创建了ISAPIWorkerRequest的对象wr,将请求报文封装到wr中。再通过一系列方法创建HttpContext上下文对象,里面包含HttpRequest和HttpResponse。

5,  然后通过HttpApplicationFactory创建一个HttpApplication对象(此对象负责真正处理页面对象的创建和执行,先在httpapplication池中看又没有这个对象,没有就new一个)

6,  在httpapplication请求管道中调用19个标准的处理事件。

在第8个事件中创建被请求的页面类对象

在第9-10事件中接受浏览器发送过来的sessionid,并且根据此值到服务器的session池           中找到相对应的session对象,并将它赋值给页面类对象的session属性。

第11-12事件执行页面类的processrequest方法。打造控件树,执行页面生命周期,调用页面类中所有控件对象的Render方法,生成html代码

7,  将html代码返回给浏览器。

转载于:https://www.cnblogs.com/wangp2012/archive/2012/11/02/2751329.html

[转]ASP.NET网页请求以及处理全过程(反编译工具查看源代码)相关推荐

  1. HTTP请求和响应全过程解析

    //转载:https://blog.csdn.net/lzghxjt/article/details/51458540 http请求与响应全过程 2016年05月24日 00:15:10 鹤啸九天19 ...

  2. 构建安全的 ASP.NET 网页和控件

    本页内容 本模块内容 目标 适用范围 如何使用本模块 威胁和对策 设计注意事项 输入验证 跨站点脚本 身份验证 授权 模拟 敏感数据 会话管理 参数处理 异常管理 审核和日志记录 小结 其他资源 本模 ...

  3. 在 ASP.NET 网页中不经过回发而实现客户端回调

    一.使用回调函数的好处 在 ASP.NET 网页的默认模型中,用户会与页交互,单击按钮或执行导致回发的一些其他操作.此时将重新创建页及其控件,并在服务器上运行页代码,且新版本的页被呈现到浏览器.但是, ...

  4. ASP.net 资源请求漏洞利用工具PadBuster

    ASP.net 资源请求漏洞利用工具PadBuster 在ASP.net 网站中,为了便于部署网站项目,开发者往往会将资源(图片.Javascript文件)嵌入到dll文件中.而网页中,会使用WebR ...

  5. Datawhale--组队学习第12期--python爬虫基础学习---task0/task1环境配置和网页请求基础

    先修知识:task0(基本类库安装,git,anaconda,文本处理) Task0(前置):需要自己安装有关环境,学习git(b站),下载有关driver Chromedriver 作用 驱动浏览器 ...

  6. php动态网站开发 唐四薪 答案,ASP动态网页设计与Ajax技术 (唐四薪谭晓兰) pdf扫描版_IT教程网...

    <asp动态网页设计与ajax技术>全面介绍了asp动态网页设计与ajax技术,采用asp作为开发环境结合基于jquery的ajax技术,显著降低了ajax的入门难度.在叙述有关原理时安排 ...

  7. ASP.NET 网页介绍

    ASP.NET 网页介绍 使用 ASP.NET 网页可以为网站创建动态内容.通过使用静态 HTML 页(.htm 或 .html 文件),服务器读取文件并将该文件按原样发送到浏览器,以此来满足 Web ...

  8. razor html帮助器,在 ASP.NET 网页(Razor)网站中创建和使用帮助器 | Microsoft Docs

    在 ASP.NET 网页(Razor)网站中创建和使用 Helper 02/17/2014 本文内容 本文介绍如何在 ASP.NET 网页(Razor)网站中创建帮助程序. 帮助器是一种可重用的组件, ...

  9. Windows Server2003 sp2重装IIS后无法浏览asp.net网页解决方法

    Windows Server2003 sp2重装IIS后无法浏览asp.net网页,但可以查看图片和html页面,说明是iis重装后asp.net没有注册好,因此需要重新注册asp.net,具体方法如 ...

最新文章

  1. SpringBoot中的线程池,你真的会用么?
  2. 青岛程序员加班看不上球赛崩溃,外卖小哥伸出援手:我帮你改代码
  3. Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表
  4. FlipView和自定义值转换器
  5. NPOI随笔——图片在单元格等比缩放且居中显示
  6. 百练4103:踩方格
  7. 为什么要使用spring IOC
  8. Asp.net 面向接口框架之应用程序上下文作用域组件
  9. 【渝粤教育】 国家开放大学2020年春季 1129土木工程力学(本) 参考试题
  10. 设计模式之四(抽象工厂模式第二回合)
  11. MapTask、ReduceTask并行度决定机制
  12. 信息学奥赛一本通 1006:A+B问题 | OpenJudge NOI 1.3 01
  13. CVPR2019 Oral!伯克利、麻省理工GAN图像合成最新成果(附开源代码)!
  14. 基于github上camera开源框架CameraKit,实现仿微信拍照摄像功能
  15. Html 排版与标签(一)
  16. TeamViewer被检测为商用后的合理申诉
  17. Python PIL库对阻挡文件blk进行解析,生成红绿色位图
  18. 华为云服务器不显示盘符,云服务器只有一个盘符可以
  19. java sql server连接字符串_java连接sql server
  20. hostapd wpa_supplicant madwifi详细分析(十)——wps原理及实现 二

热门文章

  1. 横坐标设置_默认设置解决不了?!三种办法来解决,保住了Excel的“面子”
  2. python selenium 下拉列表_Selenium+Python之下拉菜单的定位
  3. c语言goto语句用法_C语言的9种控制结构
  4. java国际化程序创建属性文件_Java国际化(i18n)ResourceBundle类
  5. c语言折半排序的程序,C语言实现九大排序算法的实例代码
  6. 纯新手DSP编程--5.29--基于CCS的DSP片级支持库CSL
  7. php自定义类生成lib,thinkphp引入自定义封装类
  8. 什么叫侧面指纹识别_正面背面侧面 你手机的指纹识别长在哪?
  9. kafka--Struct Streaming--mysql案例
  10. 数据绑定(九)Binding的数据校验