深入了解asp.net框架。生命周期以及事件处理机制
刚接触asp.net框架觉得很好奇。他的快速开发是怎么实现的。控件的状态又是怎么保持的。我们都知道http是无状态的。而且网上很多人都说使用asp.net框架使用服务器框架是非常慢的。
带着这些疑问我们来了解asp.net框架吧
我们先来简单说一下asp.net框架的执行过程
当浏览器发送一个请求 比如请求index.aspx 的页面 到底经过了哪些事情
1.首先客户端会组织请求报文发送到iis服务器
2.iis服务器通过文件后缀到扩展程序映射找到对应的处理程序即,这里这是asp.net_isapi(经典模式情况下)
3.通过这个程序将请求报文发送到asp.net框架。最先处理的则是httpRuntime.ProcessRequset方法(以后我们简称PR方法)
(1)这里会对请求报文进行解析并封装 (2)同时创建上下文对象 初始化相关属性(httpRequset,httpResponse,seeson)
4.然后通过httpAplicationFactory工厂类创建一个httpAplication对象 这个对象主要是管理我们的事件管道
5.调用httpAplicaton对象的PR方法 传递HttpContext进去 并执行我们的事件管道
6.事件管道有22个事件但是我们只要关注19个就行了
7第8个管道到第九个管道之间则通过解析创建我们的前台页面类(我们的页面编译后也会是一个类继承关系 <后台页面类<page) 然后将他保存到上下文的IhttpHander类型的RemapHandler-属性中
8.第9个事件则通过判断RemapHandelr是否实现了IRequiresSessionState接口如果实现了则通过读取cookie中的sessionId在session池中知道对应session对象
赋值到上下文的Session属性。(这里曾经的疑惑就豁然开朗了了。一般处理程序为何要手动实现这个接口才能使用session)
9.第11到第12个事件则调用RemapHandelr的PR方法这里相当于有2个分支
(1)首先我们来对比一下使用了服务器控件的页面类和没有使用服务器控件的页面类
没用使用服务器控件页面
接下来我们看一下使用了服务器控件的页面
从这里我们可以做个一个简单对比
使用了服务器控件我们知道最终都打造成控件对象(而我们知道创建对象是耗时的)
没使用服务器控件的页面只是将html写入response 其他额外的操作都没做
我们再观察一下html的对比
10想解决以上疑惑 那么我们就得了解页面的生命周期了
前面我们所说的使用了服务器控件和不使用控件的页面类对象实现的PR方法处理逻辑里面的不同点是 使用了服务器控件的页面类
的PR方法会将服务器控件以控件对象保存到数组里面。
这个时候回调用页面生命周期的一系列事件
(1)LoadState将表单隐藏域 _ViewState的数据设置到页面类对象的ViewState中 然后将viewState的数据绑定到对应的控件属性中(回发情况下 这里就是使用了数据源服务器控件保存状态的原因了(listview DataList))
(2)ProcessPostData 这里会将提交的表单元素赋值给对应的控件对象(表单类型服务器控件还原状态 textBox之类的)
(3) PageLoad 这里则是调用后台页面的我们自己写的处理逻辑的代码了
(4)ProcessPostData 这里还会调用一次(之前很疑惑。想想也就明白了 比如我们在PageLoad可能会动态的创建控件对象。那么回发情况也要还原我们手动创建的控件对象的值。那么为什么上面那一次不在这里一起处理。因为我们会在PageLoad的时候通过this.服务器控件 的形式访问 处理业务)
(5)RaiseChangeEvents方法执行控件的非点击事件
(6)RaisePostBackEvents方法执行控件的点击事件
我们观察上面的控件绑定的事件后会生成一段js 这段js 就是手动触发表单的提交事件 回发。并且把触发事件的 服务器控件id发送到服务器。5 6环境则会调用触发的服务器控件相应事件
比如可以做一个测试 一个服务器控件绑定了change事件和click事件 那么 我们点击这个事件后不仅click会在服务器调用 change也会
(7)则吧新的数据源保存到页面类的ViewState中。(下一次回发再还原)
(8)最后则调用服务器控件的Render方法生成对应的html 写入response(多态的一种展现形式)
发现写代码的时候更多时候回关注 自己写的一段代码会出现什么效果。而不会关注实现这个效果 程序中处理是千山万水才走到这一步。 那么很多东西我们都不能自己把控。所以把现在理解的东西记下来 方便查阅
深入了解asp.net框架。生命周期以及事件处理机制的更多相关文章
- asp.net页面生命周期
Asp.Net页面生命周期 本文转载自:http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html 一.什么是Asp.Net页面生命周期 当 ...
- [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(二)
ASP.NET 请求生命周期 全局应用类也可以用来跟踪每个独立请求的生命周期,包括请求从 ASP.NET 平台传递到 MVC 框架.ASP.NET 框架会创建一个定义在 Global.asax 文件中 ...
- [译] ASP.NET 生命周期 – ASP.NET 应用生命周期(一)
概述 ASP.NET 平台定义了两个非常重要的生命周期.第一个是 应用生命周期 (application life cycle),用来追踪应用从启动的那一刻到终止的那一刻.另一个就是 请求生命周期 ...
- ASP.NET页面生命周期与控件生命周期
ASP.NET页面生命周期 (1)PreInit 预初始化(2)Init 初始化(3)InitComplete 初始化完成(4)PreLoad 预加载(5)Load 加载(6)LoadComplete ...
- Asp.Net页面生命周期--转发(学海无涯)
一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页 ...
- ASP.NET MVC 生命周期
本文的目的旨在详细描述ASP.NET MVC请求从开始到结束的每一个过程.我希望能理解在浏览器输入URL并敲击回车来请求一个ASP.NET MVC网站的页面之后发生的任何事情. 为什么需要关心这些?有 ...
- Asp.Net页面生命周期【转载,地址:http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html】
一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页 ...
- Asp.net页面生命周期详解任我行(3)-服务器处理请求详细过程
前言 百度了一下才知道,传智的邹老师桃李满天下呀,我也是邹老师的粉丝,最开始学习页面生命周期的时候也是看了邹老师的视频. 本人是参考了以下前辈的作品,本文中也参合了本人心得,绝非有意盗版,旨在传播,最 ...
- 【转载】Asp.Net页面生命周期
一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页 ...
随机推荐
- Java核心技术点之注解
本博文是对Java中注解相关知识点的简单总结,若有叙述不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.什么是注解 我们大家都知道Java代码中使用注释是为了向以后阅读这份代码的人解释说明一 ...
- 关于编写Java程序让Jvm崩溃
今天在书上看到一个作者提出一个问题“怎样通过编写Java代码让Jvm崩溃”,我看了之后也不懂.带着问题查了一下,百度知道里面有这样一个答案: package jvm; public class Cra ...
- C#操作XML方法集合
一 前言 先来了解下操作XML所涉及到的几个类及之间的关系 如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家 * 1 XMLElement 主要是针对节点的一些属性进行操 ...
- Asp.Net Core-几行代码解决Razor中的嵌套if语句
MVC开发中,经常会遇到在razor中插入简单的逻辑判断. @if (clientManager.IsAdmin) { if (!Model.Topic.Top) { <a asp-action ...
- 纯C#实现Hook功能
发布一个自己写的用于Hook .Net方法的类库,代码量不大,完全的C#代码实现,是一个比较有趣的功能,分享出来希望能和大家共同探讨 安装:Install-Package DotNetDetour源码 ...
- 【干货分享】JPager.Net MVC超好用轻量级分页控件
JPager.Net MVC好用的轻量级分页控件,好用到你无法想象,轻量到你无法想象. JPager.Net MVC好用的轻量级分页控件,实现非常简单,使用也非常简单. JPager.Net M ...
- JAVA反射其实就是那么一回事
概念:什么是反射 java反射机制: JAVA反射机制是在运行状态中, 对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及 ...
- 解决nf_conntrack: table full, dropping packet问题
" > /proc/sys/net/nf_conntrack_max iptables -t raw -A PREROUTING -p tcp -m tcp --dport -j NO ...
- Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较
1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...
- [BZOJ2257][Jsoi2009]瓶子和燃料(数学)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2257 分析: 1.先考虑确定的瓶子下的最小体积是多少 ①假设只有两个瓶子v1,v2,易 ...