zoukankan      html  css  js  c++  java
  • Asp.Net 背后原理

    原文:Behind the scenes of ASPX files
    转载地址: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中声明的事件先被处理

  • 相关阅读:
    CSRF 攻击
    PHP中HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR的使用
    PHP PDO函数库详解
    STK基础
    opnet统计结果的采集模式——capture mode
    一个博客园代码高亮的方案
    博客园TinyMCE编辑器中插入的代码块使用HTML编辑器再编辑
    local statistics和global statistics的区别
    opnet的函数中FIN、FRET和FOUT
    福昕阅读器默认打开pdf文件视图大小
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/1600680.html
Copyright © 2011-2022 走看看