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类
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) 收藏 举报
浙公网安备 33010602011771号