在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
对于Asp.net页面层开发无论是写页面还是写控件,我觉得都可以用一句话描述:"Do the right thing at the right time in the right place."这是07年底的一篇东西,还是有点价值整理出来与大家共享。 本文从两个粒度对Asp.net生命周期做了展示,一是通过记录页面事件的触发顺序看请求的处理流程,一是通过Reflector看Page类内部对请求处理的实现,为了清晰我清理掉了ETW相关的代码保留了一个简化却足可以说明问题的流程骨架; 本文覆盖以下内容:
1using System;
2using System.Configuration; 3using System.Data; 4using System.Web; 5using System.Web.Security; 6using System.Web.UI; 7using System.Web.UI.HtmlControls; 8using System.Web.UI.WebControls; 9using System.Web.UI.WebControls.WebParts; 10 11public partial class _Default : System.Web.UI.Page 12 运行结果: Page_PreInit Page_Init Page_InitComplete Page_PreLoad Page_Load Page_LoadComplete Page_PreRender Page_SaveStateComplete
Page_PreInit Page_Init Page_InitComplete Page_PreLoad Page_Load Button事件触发! Page_LoadComplete Page_PreRender Page_SaveStateComplete
我们从一个更细的粒度,在Reflector中看Page对请求处理的代码:
1 private void ProcessRequestMain(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint)
2 { 3 try 4 { 5 HttpContext context = this.Context; 6 string str = null; 7 if (includeStagesBeforeAsyncPoint) 8 { 9 if (this.IsInAspCompatMode) 10 { 11 AspCompatApplicationStep.OnPageStartSessionObjects(); 12 } 13 if (this.PageAdapter != null) 14 { 15 this._requestValueCollection = this.PageAdapter.DeterminePostBackMode(); 16 } 17 else 18 { 19 this._requestValueCollection = this.DeterminePostBackMode(); 20 } 21 string callbackControlID = string.Empty; 22 if (this.DetermineIsExportingWebPart()) 23 { 24 if (!RuntimeConfig.GetAppConfig().WebParts.EnableExport) 25 { 26 throw new InvalidOperationException(SR.GetString("WebPartExportHandler_DisabledExportHandler")); 27 } 28 str = this.Request.QueryString["webPart"]; 29 if (string.IsNullOrEmpty(str)) 30 { 31 throw new InvalidOperationException(SR.GetString("WebPartExportHandler_InvalidArgument")); 32 } 33 if (string.Equals(this.Request.QueryString["scope"], "shared", StringComparison.OrdinalIgnoreCase)) 34 { 35 this._pageFlags.Set(4); 36 } 37 string str3 = this.Request.QueryString["query"]; 38 if (str3 == null) 39 { 40 str3 = string.Empty; 41 } 42 this.Request.QueryStringText = str3; 43 context.Trace.IsEnabled = false; 44 } 45 if (this._requestValueCollection != null) 46 { 47 if (this._requestValueCollection["__VIEWSTATEENCRYPTED"] != null) 48 { 49 this.ContainsEncryptedViewState = true; 50 } 51 callbackControlID = this._requestValueCollection["__CALLBACKID"]; 52 if ((callbackControlID != null) && (this._request.HttpVerb == HttpVerb.POST)) 53 { 54 this._isCallback = true; 55 } 56 else if (!this.IsCrossPagePostBack) 57 { 58 VirtualPath path = null; 59 if (this._requestValueCollection["__PREVIOUSPAGE"] != null) 60 { 61 try 62 { 63 path = VirtualPath.CreateNonRelativeAllowNull(DecryptString(this. _requestValueCollection["__PREVIOUSPAGE"])); 64 } 65 catch (CryptographicException) 66 { 67 this._pageFlags[8] = true; 68 } 69 if ((path != null) && (path != this.Request.CurrentExecutionFilePathObject)) 70 { 71 this._pageFlags[8] = true; 72 this._previousPagePath = path; 73 } 74 } 75 } 76 } 77 if (this.MaintainScrollPositionOnPostBack) 78 { 79 this.LoadScrollPosition(); 80 } 81 82 this.PerformPreInit(); 83 84 this.InitRecursive(null); 85 86 this.OnInitComplete(EventArgs.Empty); 87 88 if (this.IsPostBack) 89 { 90 this.LoadAllState(); 91 92 this.ProcessPostData(this._requestValueCollection, true); 93 94 } 95 96 97 this.OnPreLoad(EventArgs.Empty); 98 99 this.LoadRecursive(); 100 101 if (this.IsPostBack) 102 { 103 this.ProcessPostData(this._leftoverPostData, false); 104 105 this.RaiseChangedEvents(); 106 107 this.RaisePostBackEvent(this._requestValueCollection); 108 109 } 110 111 this.OnLoadComplete(EventArgs.Empty); 112 113 if (this.IsPostBack && this.IsCallback) 114 { 115 this.PrepareCallback(callbackControlID); 116 } 117 else if (!this.IsCrossPagePostBack) 118 { 119 120 this.PreRenderRecursiveInternal(); 121 } 122 } 123 if ((this._asyncInfo == null) || this._asyncInfo.CallerIsBlocking) 124 { 125 this.ExecuteRegisteredAsyncTasks(); 126 } 127 if (includeStagesAfterAsyncPoint) 128 { 129 if (this.IsCallback) 130 { 131 this.RenderCallback(); 132 } 133 else if (!this.IsCrossPagePostBack) 134 { 135 this.PerformPreRenderComplete(); 136 137 if (context.TraceIsEnabled) 138 { 139 this.BuildPageProfileTree(this.EnableViewState); 140 this.Trace.Write("aspx.page", "Begin SaveState"); 141 } 142 143 this.SaveAllState(); 144 145 this.OnSaveStateComplete(EventArgs.Empty); 146 if (str != null) 147 { 148 this.ExportWebPart(str); 149 } 150 else 151 { 152 this.RenderControl(this.CreateHtmlTextWriter(this.Response.Output)); 153 } 154 155 this.CheckRemainingAsyncTasks(false); 156 } 157 } 158 } 159 catch (ThreadAbortException exception) 160 { 161 HttpApplication.CancelModuleException exceptionState = exception.ExceptionState as HttpApplication.CancelModuleException; 162 if (((!includeStagesBeforeAsyncPoint || !includeStagesAfterAsyncPoint) || ((this._context.Handler != this) || (this._context.ApplicationInstance == null))) || ((exceptionState == null) || exceptionState.Timeout)) 163 { 164 this.CheckRemainingAsyncTasks(true); 165 throw; 166 } 167 this._context.ApplicationInstance.CompleteRequest(); 168 Thread.ResetAbort(); 169 } 170 catch (ConfigurationException) 171 { 172 throw; 173 } 174 catch (Exception exception3) 175 { 176 PerfCounters.IncrementCounter(AppPerfCounter.ERRORS_DURING_REQUEST); 177 PerfCounters.IncrementCounter(AppPerfCounter.ERRORS_TOTAL); 178 if (!this.HandleError(exception3)) 179 { 180 throw; 181 } 182 } 183 } 184 185 186 187 188
private void PerformPreInit()
{ this.OnPreInit(EventArgs.Empty); this.InitializeThemes();//看到主题和模板页是什么时候加载了吧 this.ApplyMasterPage(); this._preInitWorkComplete = true; } MSDN上对Asp.net生命周期解释有非常重要的四个表格:
全部评论
专题导读
上一篇:Asp.Net分页和AspNetPager控件的使用发布时间:2022-07-10下一篇:ASP.NET 2.0中的数据操作:给新增、编辑界面增加验证控件 (翻译) ...发布时间:2022-07-10热门推荐
热门话题
阅读排行榜
|
请发表评论