淺談ASP.NET內部機制(四)

來源:互聯網
上載者:User

                                        淺談ASP.NET內部機制(四)

      前言:在用ASP.NET開發網站的時候,常常看到"生命週期"周期整個詞,在ASP.NET AJAX用戶端開發時,也有生命週期的概念。覺得微軟很喜歡引入生命週期。其實生命週期還是蠻好的,可以使得我們對程式啟動並執行每個過程都可以掌控,提供更加靈活的開發。如果被生命週期弄糊塗了就不好了...
 

系列文章連結:

淺談ASP.NET的內部機制(一)

淺談ASP.NET的內部機制(二)

淺談ASP.NET內部機制(三)

淺談ASP.NET內部機制(四)

淺談ASP.NET內部機制(五)

淺談ASP.NET內部機制(六)

淺談ASP.NET內部機制(七)

淺談ASP.NET內部機制(八)

      本系列的文章中很少涉及代碼,希望大家見諒!
      我這裡也不想羅列MSDN上的東西。而是想盡量的把相應的知識說的更加通俗。簡單的說來,再ASP.NET啟動並執行時候一般會有兩個比較明顯的生命週期。一個發生再Http管道的生命週期,另外一個就是我們常說的頁面的生命週期。生命週期說白了就是處理的流程。

      下面我們就來分別的介紹這兩個生命週期。
      Http管道中的生命週期(將其中重要的講解下)。
 其實所謂的http管道簡單的說其實就是載入相應的httpmodule和httphandler的過程。應該還記得我們之前的那幅圖。如下:

     
     

 

      當一個請求被ASP.NET     運行時開始處理的時候,http管道就開始載入很多的httpmodule(http模組)和處理相應資源的httphandler(http處理常式)。我們就從一個請求被處理的流程來說起(是按照被處理的先後順序來說的)。

      首先,當一個請求來了以後,ASP.NET運行時就要開始處理這個請求。大家應該還知道,再一個ASP.NET程式來開始啟動並執行時候,應用程式定義域(Domain)中會初始化一個HttpApplication類的執行個體來主導整個程式的運行,通俗的說就是用一個對象來控制整個程式的運行流程。請求來了,HttpApplication類的執行個體(以後簡稱Application)就觸發BeginRequest事件(請求開始)來開始處理請求。從這點意義來說,我們其實可以把http管道生命週期這個過程看成是Application處理一個請求的時候觸發相應事件的過程。而且Application的事情的觸發是自動的,而且我們也可以註冊這些事件,以便在相應的時候執行我們的代碼。比如在這個事件中,因為請求剛剛開始,其實我們可以註冊這個事件來執行url的重寫,來把請求的url重新置放。比如我們原來請求http://www.cnblogs.com/yanyangtian,但是在網站的伺服器中,沒有yanyangtian這個檔案夾或者檔案,其實這就是url重寫的例子,其實就是在這個BeginRequest中把url換成了http://www.cnblogs.com/index.aspx?name=yanyantian.

      接下來就是開始了一些驗證方面的處理,因為一個請求進來了以後,會帶來一些額外的資訊。這些資訊都儲存在相應的HTTP Header中。一個請求通常是要求查看相應的頁面或者檔案,所以我們來儲存這個請求有足夠的許可權來查看檔案或者頁

面,所以這時候就觸發Application的AuthenticateRequest事件,而且來會調用相應的模組了處理,如我們熟悉的Windows驗證模組和Forms驗證模組。大家應該還記得我們之前的文章中有提過:asp.net_filter把url中的cookieless資訊轉換為相應的Http Header,以便以後驗證。此時,就會用到之前的那些cookieless中的資訊來驗證了。而且我們也可以在這裡做一些自己的控制,如原來請求的cookie中傳入的使用者明是xiaoyang,我們其實在這裡可以改為其他的使用者名稱。其實有關驗證(安全方面)話題很大,我之後會有另外的系列文章來專門講述的。

      再接下來就是觸發PostAuthenticateRequest事件,之前是驗證,現在實際上是驗證已經完了,而且此時我們對驗證中的一些資訊再也不能改變,比如之前驗證的(如Forms),我們把使用者名稱儲存在了FormsIdentity的Name屬性中,此時我不能再改變Name屬性了。其實在這裡就是設定驗證的狀態,驗證通過就設定StatusCode=200,否則失敗,然後請求就結束了。

      接下來就是開始了授權方面的操作,觸發AuthorizeRquest.通過驗證,並不說明我們的請求就可以訪問相應的頁面或者檔案。打個比方,我們可以通過通行證去參加一個會議,但是我們不能去主席台就坐,因為我們的通行證的許可權有限。我們的通行證僅僅只是讓我們可以進入會場而已。同驗證過程一樣,我們也可以在這裡執行一些自己的代碼,比如我們可以冒充別的使用者,用他們的許可權來做一些事情。

      接下來就是PostAuthorizeRequest,授權處理在這裡完成了,我們就可以知道:到底允不允許一個請求查看一個檔案或者頁面。

      接下來就是就執行一些請求的緩衝以及session的一些儲存更新的操作。而這些過程我們一般不是很關注。我們的請求在上述的處理過程中被一個模組傳給另外的一個模組,在它們之間傳遞著。不管我們請求的是什麼,是圖片,是音頻,還是別的檔案,最後請求終究還是要被處理的。而這個處理的的是在Application的PreRequestHandlerExecute事件(預請求處理,也就是將要請求處理之前)中決定的。因為在ASP.NET的設定檔中,就已經註冊了很多相應檔案的處理常式,常見的就是.aspx檔案是由Page(實現了IHttpHandler介面)處理的。在這個事件中實際上就可以是認為在配置尋找:請求的檔案是否有相應的處理常式程式,如果有,就載入這個處理常式。假如我們之前請求的是default.aspx,那麼就決定由Page來處理這個請求。然後就進入了頁面的生命週期。

      當頁面生命週期完成之後,Application繼續觸發一些事件,直到EndRequest。

      綜上,可以看出,頁面生命週期是包含在Http管道的生命週期之中的。

     我們用下面的圖總結:

      

     有關頁面的生命週期,下次說。今天就到這裡,理論很多,大家見諒!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.