Asp.Net 背后原理
转载地址:http://blog.joycode.com/microhelper/articles/9811.aspx
Asp.net Page文件通常有两个文件,aspx文件定义外观,cs文件((Code behind文件)处理事件,运行时,每一个cs文件会被编译成dll文件。
当page第一次被访问的时候,
1:.net会根据aspx文件生成一个cs文件
2:用csc.exe把这个cs文件编译成dll
3: 运行编译生成的这个dll
上面的过程只有第一次请求页面时才发生,所以第一次访问某个page时会感觉比较慢。
以后.net就用dll来处理对这个页面的请求,如果aspx文件有变化,,net会重新生成dll文件
生成的这个dll文件可以在
C:\$WINDOWSDir$\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\$YourWebAppName$\4449be44\81bf2529
(最后面两级目录的名字是随机的)
目录下找到,我们可以看到这个目录下除了cs文件外还有其他类型的文件,其中
*.cs:??根据aspx文件生成的cs文件
*.res ??资源文件
*cmdline ?用来编译*.cs文件的命令行
*.err? ??编译*.cs的错误
*out ??编译时的输出文件
*.dll ??编译生成的文件
*pdb ??编译生成的文件
*.xml??存储aspx文件名和.net生成的用来命名文件的随机数之间的映射关系
我们可以看到Temporary ASP.NET Files\$YourWebAppName$\目录下的文件,除了xml文件之外都是以随机数字作为文件名,所以需要一个page
的实际名字与随机数字之间的映射关系,这个映射存储在xml文件中。
比如
???
???
我们根据这个映射,找到生成的cs文件
从cs文件里,我们可以看到,cs文件中标出了与aspx原文件相对应的行号
比如
aspx文件中第三行为
相应的cs文件中
#line 3 "F:\CRM\TestControl.ascx"
__ctrl = new System.Web.UI.WebControls.TextBox();
.............
另一方面,我们可以注意到每一个根据aspx文件生成的类都继承了aspx文件的code behind类,并且实现了其接口。
比如:???
public class TestControl_ascx : CRM.TestControl
public class WebForm1_aspx : CRM.WebForm1, System.Web.SessionState.IRequiresSessionState
根据aspx文件生成的类先于code behide类被调用,其构造函数会初始化所依赖的文件
public WebForm1_aspx() {
?System.Collections.ArrayList dependencies;
??????????? if ((ASP.WebForm1_aspx.__initialized == false)) {
??????????????? ASP.WebForm1_aspx.__stringResource = System.Web.UI.TemplateControl.ReadStringResource(typeof(ASP.WebForm1
_aspx));
??????????????? dependencies = new System.Collections.ArrayList();
??????????????? dependencies.Add("F:\\CRM\\webform1.aspx");
??????????????? dependencies.Add("F:\\CRM\\bin\\CRM.DLL");
??????????????? dependencies.Add("F:\\CRM\\TestControl.ascx");
??????????????? ASP.WebForm1_aspx.__fileDependencies = dependencies;
??????????????? ASP.WebForm1_aspx.__initialized = true;
??????????? }
??????????? this.Server.ScriptTimeout = 30000000;
??????? }
其构造函数执行后,会执行override的函数FrameworkInitialize,
函数FrameworkInitialize调用__BuildControlTree 来构造所有页面上的控件,
综上所述,请求aspx页面时,有两个类参与
1:code behind class ?– WebForm1.
2:从ASPX生成的类?– adbdef.
执行的顺序为
1:adbdef的构造函数
2:WebForm1的构造函数
3:adbdef类的方法FrameworkInitialize
4:FrameworkInitialize调用__ BuildTree创建各个控件
5:按顺序调用Page和controls的事件处理程序,ASPX中声明的事件先被处理