ASP.net MVC 运行流程 (-)

              

ASP.NET网页请求以及处理全过程(反编译工具查看源代码)

2012年12月07日  ⁄ 综合 ⁄ 共 3361字 ⁄ 字号  小 中 大  ⁄ 评论关闭

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

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

当敲一个域名到浏览器上面,然后回车的时候,如: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查看)。

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

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

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

器客户端。

下面是对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方法

接着就会调用HttpRuntimeProcessRequestNoDemand方法。将wr传进去

进入这个方法

在这个方法的最后会调用

ProcessRequestNow方法。处理请求

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

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

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

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

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

初始化Response.

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

一个是httpwriter,一个是textwriter

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

下面打开HttpApplication这个类

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

1BeginRequest

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

2-3AuthenticateRequestPostAuthenticateRequest

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

4-5AuthorizeRequestPostAuthorizeRequest

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

6-7ResolveRequestCachePostResolveRequestCache

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

8PostMapRequestHandler

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

9-10AcquireRequestStatePostAcquireRequestState

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

11-12PreRequestHandlerExecutePostRequestHandlerExecute

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

13-14ReleaseRequestStatePostReleaseRequestState

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

15-16UpdateRequestCachePostUpdateRequestCache

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

17-18LogRequestPostLogRequest

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

19EndRequest

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

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

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

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

下面是状态保持:sessioncookie viewstate。写完状态保持再仔细将在1112事件中具体做了什么事情

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值