天天看點

asp.net生命周期

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/qq1010885678/article/details/37540769

當使用者起一個請求到伺服器,伺服器接收到請求并将該頁面傳回給浏覽器。

這一個看似簡單的過程中間到底經曆了什麼?

我們可以稱這一過程為頁面的生命周期,即,一個頁面從開始被請求到請求結束銷毀的過程

而這其中aspx和ashx的生命周期又不一樣,mvc的生命周期更是大不相同

首先僅讨論aspx和ashx

因為這兩者的生命周期非常相似

不同點僅僅在于aspx多幹了幾件事情

這從ashx頁面的ProcessRequest方法中可以看出一二(以下稱ProcessRequest方法是pr方法)

首先

使用者起一個請求到伺服器

iis伺服器接收到使用者的請求,并判所請求的檔案類型

如果是html,css,js,jpg等靜态的檔案

iis将會在本地磁盤上找到相關的檔案直接發送回浏覽器

這就是為什麼靜态頁的相應速度比較快,要使用頁面靜态化技術的原因

如果是aspx,ashx甚至可能是php,jsp這種動态頁面又該怎麼處理呢?

在iis中儲存着一張映射表

該表中記錄着各個動态檔案所對應的字尾名

以及對應的可以處理該動态檔案的程式集

比如:aspx和ashx對應的為aspnet_isapi.dll

iis通過這個起着橋梁作用的程式集與.net framework相連

将iis不能處理的動态檔案交給framework處理

在framework中經過一系列的處理裝載生成了對應的頁面

在通過橋梁傳回給iis,之後再傳回給浏覽器

這就是簡單的asp.net生命周期過程

如下圖(asp.net請求管道第一版):

詳細的asp.net頁面生命周期:

浏覽器發送請求到iis

iis無法處理動态頁面

交給 映射表中對應的擴充程式集

 将請求發給 Framework 

調用HttpRuntime.ProcessRequest()方法開始整個asp.net生命周期(  HttpRuntime中有一個指向擴充程式的指針用來接受和發送封包 )

這時會先建立一個HttpWorkRequest對象,裡面存放着請求的原始封包資料 

根據 HttpWorkRequest對象建立一個HttpContext對象存放處理過的封包資訊以供給程式員使用,全都封裝在

context對象中的Request屬性中,如Request.Form,而Response屬性中将會儲存生成的響應封包的資料(這裡有沒有覺得很熟悉,我們經常會使用到的方法和屬性就是這裡來的)

 在這之後會通過HttpApplicationFactory 建立一個 HttpApplication然後調用ProcessRequest方法來處理整個請求(這裡也會用到HttpContext上下文封裝的請求資訊)

在該pr方法中按照執行順序的19個事件的過程組成了一個請求管道(這個pr方法其實就是執行一系列的事件)

其中第八個事件時建立被請求的頁面類對象并轉成IHttpHandler接口(對這個接口有沒有很熟悉)

在11與12個事件之間執行頁面類對象的ProcessRequest方法

在這裡,ashx的pr方法是直接提供給程式員寫的,是以裡面隻是一些簡單的代碼

而aspx的pr方法中,還調用了BuildControlTree()生成頁面空間樹,之後調用Rend方法根據空間樹生成html代碼

這就是為ashx響應速度會比aspx快,因為ashx的pr方法很簡潔

所有事件執行完畢

之後,會有一個FinishRequest方法結束請求管道

在通過HttpWorkRequest 将生成的html代碼傳回給擴充程式

交給iis

傳回給浏覽器

詳情如下圖:

借助反編譯攻擊Reflector我們可以看到生命周期的整個過程

記錄的不怎麼清楚,自己的了解也表達不清楚

希望大俠給予指導