Asp.Net运行原理分析

虽然用Asp.Net已经有两年了,但一直对它内部的运行机制不了解。刚好近来弄到Refectror.Net这个工具,就想用该工具分析一下
Asp.net页面在编译后,就行产生了什么东东:)。
在每个系统盘的\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files目录,存放着asp.net网站编译后
的dll文件。其实对于每个Request,都是调用该Dll里面的类来响应Request。
一、建立一个新的WebSite。
    首先,我建立一个新的WebSite,该WebSite只有一个页面Default.aspx。default页面里具有三个服务器控件,Form,DropDownList,TextBox,
Html文本。
   建立完成后,我就对该WebSite进行编译。编译后,我去查看\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files目录,
就发现里面多了一个WebSite1目录。在该文件夹里面,你会发现一个以字母和数字结合命名的dll。把该dll拖进Refectror.exe,就可以看到该dll反编译后的代码。
 
 
二、代码分析
  首先我们会发现dll里面有两个类,一个是_Default类,另外一个是default_aspx类。
  1、_Default类
   通过查看该类的定义,你会发现,对每个定义的服务器控件,编译器都为服务器控件生成一个Get和Set的属性。
            
public class _Default : Page, IRequiresSessionState
            {
            // Fields
            [AccessedThroughProperty("ddllist1")]
            private DropDownList _ddllist1;
            [AccessedThroughProperty("form1")]
            private HtmlForm _form1;
            [AccessedThroughProperty("textbox1")]
            private TextBox _textbox1;
            // Properties
            protected HttpApplication ApplicationInstance
            {
            get
            {
            return this.Context.ApplicationInstance;
            }
            }
            protected virtual DropDownList ddllist1
            {
            get
            {
            return this._ddllist1;
            }
            [MethodImpl(MethodImplOptions.Synchronized)]
            set
            {
            this._ddllist1 = value;
            }
            }
            protected virtual HtmlForm form1
            {
            get
            {
            return this._form1;
            }
            [MethodImpl(MethodImplOptions.Synchronized)]
            set
            {
            this._form1 = value;
            }
            }
            protected DefaultProfile Profile
            {
            get
            {
            return (DefaultProfile) this.Context.Profile;
            }
            }
            protected virtual TextBox textbox1
            {
            get
            {
            return this._textbox1;
            }
            [MethodImpl(MethodImplOptions.Synchronized)]
            set
            {
            this._textbox1 = value;
            }
            }
            }
            
 
 2、default_aspx类
            
    该类才是最终响应Request的类。该类根据服务器控件和Html脚本的定义,把服务器控件和作为Literal控件的Html脚本插入到本Page的控件树上。
在最后Render时,根据控件树,从头节点开始遍历,输出每个节点的Content。就通过对控件树的完全遍历,输出整个Html给用户。
 
public class default_aspx : _Default
            {
            // Fields
            private static object __fileDependencies;
            private static bool __initialized;
            private static object __stringResource;
            // Methods
            [DebuggerNonUserCode]
            public default_aspx()
            {
            this.AppRelativeVirtualPath = "~/Default.aspx";
            if (!__initialized)
            {
            __stringResource = RuntimeHelpers.GetObjectValue(this.ReadStringResource());
            string[] virtualFileDependencies = new string[] { "~/Default.aspx", "~/Default.aspx.vb" };
            __fileDependencies = RuntimeHelpers.GetObjectValue(this.GetWrappedFileDependencies(virtualFileDependencies));
            __initialized = true;
            }
            }
            [DebuggerNonUserCode]
            private DropDownList __BuildControlddllist1()
            {
            DropDownList list2 = new DropDownList();
            this.ddllist1 = list2;
            list2.ApplyStyleSheetSkin(this);
            list2.ID = "ddllist1";
            return list2;
            }
            [DebuggerNonUserCode]
            private HtmlForm __BuildControlform1()
            {
            HtmlForm form2 = new HtmlForm();
            this.form1 = form2;
            form2.ID = "form1";
            IParserAccessor accessor = form2;
            accessor.AddParsedSubObject(new LiteralControl("\r\n    <div>\r\n    "));
            TextBox box = this.__BuildControltextbox1();
            accessor.AddParsedSubObject(box);
            accessor.AddParsedSubObject(new LiteralControl("\r\n    <span>Hello World!</span>\r\n    <br />\r\n    "));
            DropDownList list = this.__BuildControlddllist1();
            accessor.AddParsedSubObject(list);
            accessor.AddParsedSubObject(new LiteralControl("\r\n    \r\n    </div>\r\n    "));
            return form2;
            }
            [DebuggerNonUserCode]
            private TextBox __BuildControltextbox1()
            {
            TextBox box2 = new TextBox();
            this.textbox1 = box2;
            box2.ApplyStyleSheetSkin(this);
            box2.ID = "textbox1";
            box2.Text = "TextBox1";
            return box2;
            }
            [DebuggerNonUserCode]
            private void __BuildControlTree(default_aspx __ctrl)
            {
            this.InitializeCulture();
            IParserAccessor accessor = __ctrl;
            accessor.AddParsedSubObject(this.CreateResourceBasedLiteralControl(0, 310, false));
            HtmlForm form = this.__BuildControlform1();
            accessor.AddParsedSubObject(form);
            accessor.AddParsedSubObject(new LiteralControl("\r\n</body>\r\n</html>\r\n"));
            }
            [DebuggerNonUserCode]
            protected override void FrameworkInitialize()
            {
            base.FrameworkInitialize();
            this.SetStringResourcePointer(RuntimeHelpers.GetObjectValue(__stringResource), 0);
            this.__BuildControlTree(this);
            this.AddWrappedFileDependencies(RuntimeHelpers.GetObjectValue(__fileDependencies));
            this.Request.ValidateInput();
            }
            [DebuggerNonUserCode]
            public override int GetTypeHashCode()
            {
            return 0x66972077;
            }
            [DebuggerNonUserCode]
            public override void ProcessRequest(HttpContext context)
            {
            base.ProcessRequest(context);
            }
            // Properties
            protected override bool SupportAutoEvents
            {
            get
            {
            return false;
            }
            }
            }
            
 

 

 

posted on 2009-03-24 17:04  TylerDurdon  阅读(824)  评论(0)    收藏  举报

导航