Asp.net應用程序管道處理用戶請求時特別強調"時機",對Asp.net生命周期的了解多少直接影響我們寫頁面和控件的效率。
對於Asp.net MVC,我對它的生命周期還是興趣很濃,於是提出兩個問題:
一個HTTP請求從IIS移交到Asp.net運行時,Asp.net MVC是在什麼時機獲得了控制權並對請求進行處理呢?處理過程又是怎樣的?
以IIS7中asp.net應用程序生命周期為例,下圖是來自MSDN的一張HTTP請求處理過程發生事件的簡圖,後面我列出了一個完整的事件列表。既然Asp.net Mvc還是以Asp.net運行時為基礎那麼它必然要在Asp.net應用程序的生命周期中對請求進行截獲。第一反應當然是去web.config裡面去翻翻,我們可以看到UrlRoutingModule的配置節:
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
下面要做的就順理成章了,用Reflector打開這個程序集,可以看到以下代碼:
protected virtual void Init(HttpApplication application)
{
application.PostResolveRequestCache += new EventHandler(this.OnApplicationPostResolveRequestCache);
application.PostMapRequestHandler += new EventHandler(this.OnApplicationPostMapRequestHandler);
}
看到這裡我們的第一個問題實際上已經有了答案:時機是在PostResolveRequestCache和PostMapRequestHandler.
ResolveRequestCache event
Occurs when ASP.NET finishes an authorization event to let the caching modules serve requests from the cache, bypassing execution of the event handler (for example, a page or an XML Web service).
源文檔 <http://msdn.microsoft.com/en-us/library/system.web.httpapplication.resolverequestcache.aspx>
PostMapRequestHandler event
Occurs when ASP.NET has mapped the current request to the appropriate event handler.
源文檔 <http://msdn.microsoft.com/en-us/library/system.web.httpapplication.postmaprequesthandler.aspx>