关于ASP.NET的运行机制,和使用return和response.end()的个人看法

注:这里只探讨ASP.NET页面

当浏览器访问一个页面的时候,浏览器会向对应的服务器的IIS发送一个请求报文,IIS(IIS7/8集成模式条件下)在接收到响应报文后,会转交给响应的处理程序处理,大概步骤如下

IIS--->IsAPPRuntime--->HttpRunTime(此对象内部有:HttpRequest,HttpResponse,Session,Sever,remapHandler和HttpApplication)

其中HttpRequest负责解析请求报文并将报文相关信息封装到各个属性字段中

HttpResponse负责组装响应报文,其中有一个write()方法,提供给外部,用于向报文体追加信息

Sever类似一个工具对象,

在初始化HttpRequest对象和HttpResponse对象后HttpApplication开始工作了

首先它会执行ProcessRequest(简称PR)方法,方法内部执行

19个事件(管道事件)

其中第8个事件会判断当前请求报文访问的页面是不是asp.net页面,如果是,就会通过反射方式,创建后台页面类的对象(同时在这步触发.aspx页面编译程序集的过程???<这一步有待考证>),并将后台页面类的对象保存在remapHandler中

第9,10个事件,初始化Session

在11和12事件之间,就会调用remapHandler中后台页面类的对象的PR方法

在这个时候,出现两种情况,如果是.ASHX,执行完RP方法后,会继续后面的管道事件(释放内存---返回响应报文到IIS),如果是.ASPX,则会执行其生命周期,其中会先执行.ASPX.CS对象的Page_Load()方法,也就是程序员书写代码的地方.相信很多人,不太明白在这里用Return和response.end()的区别,在这之前,我也不太理解,后来通过思考,大概能明白其中原理了,

其中Page_Load是优先于前台页面渲染的(即后台Page_Load执行完毕,最后才会执行生成前台页面HTML的代码),在这里:

如果使用Return,只是相当于跳出了Page_Load方法,Page_Load方法跳出来后,页面的生命周期还是会继续执行,所以在执行后面的代码时候,经常会出现"未将对象引用到实例的错误",

如果使用response.end(),按照我自己的理解,我觉得就相当于是终止页面生命周期,并立即返回响应报文,所以Page_Load()后面代码会直接跳过,直接执行到管道事件的第13.....到19个释放对象事件,一直到返回响应报文...

 

以上均属个人看法,若有不对的地方,欢迎指正

转载于:https://www.cnblogs.com/Savcry/articles/3562250.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值