當前位置:編程學習大全網 - 源碼下載 - ASP.NET HTTP運行時組成詳解(下)

ASP.NET HTTP運行時組成詳解(下)

  三 HTTP 管道

 ASP NET ISAPI 擴展啟動輔助進程後 它將傳遞部分命令行參數 輔助進程使用這些參數來執行加載 CLR 前需要執行的任務 傳遞的值包括 和 D 安全性所要求的身份驗證等級 可以使用的命名管道的數量和 IIS 進程標識 命名管道的名稱是使用 IIS 進程標識和允許的管道數隨機生成的 輔助進程不接收可用管道的名稱 但可以接收識別管道名稱所需的信息

  和 D 安全性與 Microsoft? NET Framework 有何關系?實際上 CLR 是作為 對象提供的 更準確地說 CLR 本身不是由 代碼構成的 但是指向 CLR 的接口卻是壹個 對象 因此 輔助進程加載 CLR 的方式與加載 對象的方式相同

 當 ASPX 請求遇到 IIS 時 Web 服務器將根據選擇的身份驗證模型(匿名 Windows Basic 或 Digest)來分配壹個令牌 當輔助進程收到要處理的請求時 令牌被傳遞到輔助進程 請求由輔助進程中的線程獲取 該線程從最初獲取傳入請求的 IIS 線程繼承身份令牌 在 aspnet_wp exe 中 負責處理請求的實際帳戶取決於在特殊的 ASP NET 應用程序中是如何配置模擬的 如果模擬被禁用(默認設置) 則線程將在輔助進程的帳戶下運行 默認情況下 該帳戶在 ASP NET 進程模型中為 ASPNET 在 IIS 進程模型中為 NEORKSERVICE 這兩個帳戶都是 弱 帳戶 提供的功能比較有限 可以有效抵擋回復性攻擊 (Revert to self Attack) (回復性攻擊是指將模擬的客戶端的安全性令牌回復到父進程令牌 為輔助進程分配弱帳戶可以挫敗此類攻擊 )

 高度概括起來 ASP NET 輔助進程完成的壹項主要任務就是將請求交給壹系列稱為的 HTTP 管道的托管對象 要激活 HTTP 管道 可以創建壹個 HttpRuntime 類的新實例 然後調用其 ProcessRequest 方法 如前所述 ASP NET 中始終只運行壹個輔助進程(除非啟用了 Web Garden 模型) 該進程在獨立的 AppDomain 中管理所有的 Web 應用程序 每個 AppDomain 都有自己的 HttpRuntime 類實例 即管道中的輸入點 HttpRuntime 對象初始化壹系列有助於實現請求的內部對象 Helper 對象包括緩存管理器(Cache 對象)和內部文件系統監視器(用於檢測構成應用程序的源文件的更改) HttpRuntime 為請求創建上下文 並用與請求相關的 HTTP 信息填充上下文 上下文用 HttpContext 類的實例來表示

 另壹個在 HTTP 運行時的設置初期創建的 Helper 對象是文本書寫器 用於包含瀏覽器的響應文本 文本書寫器是 HttpWriter 類的實例 此對象對頁面代碼以編程方式發送的文本進行緩存 HTTP 運行時被初始化後 它將查找實現請求的應用程序對象 應用程序對象是 HttpApplication 類的實例 該類就是 global asax 文件背後的類 global asax 在編程時是可選的 但在構建結構時是必需的 因此 如果應用程序中沒有構建類 則必須使用默認對象 ASP NET 運行時包括幾個中間工廠類 可以用來查找並返回有效的 Handler 對象以處理請求 整個過程中用到的第壹個工廠類是 HttpApplicationFactory 它的主要任務是使用 URL 信息來查找 URL 虛擬目錄和匯集的 HttpApplication 對象之間的匹配關系

 應用程序工廠類的行為可以概括為以下幾點

 工廠類維護 HttpApplication 對象池 並使用它們來處理應用程序的請求 池的壽命與應用程序的壽命相同

 應用程序的第壹個請求到達時 工廠類提取有關應用程序類型的信息(global asax 類) 設置用於監視更改的文件 創建應用程序狀態並觸發 Application_OnStart 事件

 工廠類從池中獲取壹個 HttpApplication 實例 並將要處理的請求放入實例中 如果沒有可用的對象 則創建壹個新的 HttpApplication 對象 要創建 HttpApplication 對象 需要先完成 global asax 應用程序文件的編譯

 HttpApplication 開始處理請求 並且只能在完成這個請求後才能處理新的請求 如果收到來自同壹資源的新請求 則由池中的其他對象來處理

 應用程序對象允許所有註冊的 HTTP 模塊對請求進行預處理 並找出最適合處理請求的處理程序類型 這通過查找請求的 URL 的擴展和配置文件中的信息來完成

 HTTP 處理程序是壹些實現 IHttpHandler 接口的類 NET Framework 為常見的資源類型提供了壹些預定義的處理程序 包括 ASPX 頁面和 Web 服務 machine config 文件中的 <Handlers> 部分定義了 HttpApplication 對象必須實例化才能處理特定類型資源的請求的類名 如果 Helper 類是壹個處理程序工廠 GetHandler 方法將確定要使用的處理程序類型 這時 將從壹組類似的對象中獲取適當類型的處理程序 並對其進行配置以處理請求

 IHttpHandler 接口提供了兩個方法 IsReusable 和 ProcessRequest 前者將返回壹個布爾值 表示處理程序是否可以被匯集 (大多數預定義的處理程序都是匯集的 但是您可以自行定義每次都需要新實例的處理程序 )ProcessRequest 方法包含處理特定類型資源所需的所有邏輯 例如 ASPX 頁面的處理程序基於以下偽代碼

private void ProcessRequest() {// 確定請求是否是回發 (postback)IsPostBack = DeterminePostBackMode();

// 觸發 ASPX 源代碼的 Page_Init 事件PageInit();

// 加載 ViewState 處理已發送的值 if (IsPostBack) {LoadPageViewState();ProcessPostData();}

// 觸發 ASPX 源代碼的 Page_Load 事件PageLoad();

// ) 再次處理已發送的值(當// 動態創建控件時)// ) 將屬性更改的服務器端事件提升為輸入驅動的// 控件(即復選框的狀態改變)// ) 執行與回發事件相關的所有代碼if (IsPostBack) {ProcessPostDataSecondTry();RaiseChangedEvents();RaisePostBackEvent();}

// 觸發 ASPX 源代碼的 Page_PreRender 事件PreRender();

// 將控件的當前狀態保存到 ViewState 中SavePageViewState();

// 將頁面內容呈現給 HTMLRenderControl(CreateHtmlTextWriter(Response Output));}

 無論調用的資源類型如何 基於 HTTP 處理程序的模型是相同的 唯壹隨資源類型變化而變化的元素是處理程序 HttpApplication 對象負責查找應該使用哪種處理程序來處理請求 HttpApplication 對象還負責檢測對動態創建的 表示資源的程序集(如 aspx 頁面或 a *** x Web 服務)所進行的更改 如果檢測到更改 應用程序對象將確保編譯並加載所請求的資源的最新來源

  四 臨時文件和頁面程序集

 要全面了解 ASP NET HTTP 運行時 讓我們來分析壹下當請求 ASP NET 頁面時 文件系統層所發生的變化 接下來 您將了解由 HTTP 管道的對象管理和監視的壹組動態創建的臨時文件

 雖然可以將頁面的核心代碼隔離在代碼背後的 C# 或 Microsoft? Visual Basic? NET 類中 但可以將 Web 頁面編寫和部署為 aspx 文本文件 對於要顯示為 URL 的頁面來說 aspx 文件在應用程序的 Web 空間中必須始終可用 aspx 文件的實際內容將確定應用程序對象要加載的程序集(或多個程序集)

 按照設計 HttpApplication 對象將查找壹個根據請求的 ASPX 文件命名的類 如果頁面命名為 sample aspx 則要加載的相應的類名為 ASP sample_aspx 應用程序對象在 Web 應用程序的所有程序集文件夾中查找這樣的類 這些文件夾包括全局程序集緩存 (GAC) Bin 子文件夾和 Temporary ASP NET Files 文件夾 如果未找到這樣的類 HTTP 結構將分析 aspx 文件的源代碼 創建壹個 C# 或 Visual Basic NET 類(具體創建哪種類 取決於 aspx 頁面上設置的語言) 同時對其進行編譯 新創建的程序集的名稱是隨機生成的 位於特定於應用程序的子文件夾中 路徑如下所示 C:\WINDOWS\Microsoft NET\Framework\v \Temporary ASP NET Files

 子文件夾 v 特定於 ASP NET 如果您使用的是 ASP NET 子文件夾的版本號會有所不同 即子文件夾名為 v 再次訪問頁面時 程序集就已存在 不需要重新創建 但是 HttpApplication 對象是如何確定特定於頁面的程序集是否存在呢?它每次都要掃描大量文件夾嗎?不 並不是這樣

 應用程序對象只查看 Temporary ASP NET Files 文件夾中某個特殊文件夾的內容 具體路徑(特定於應用程序的路徑)由 HttpRuntime CodegenDir 屬性返回 如果是第壹次訪問 aspx 文件(即還未創建頁面程序集) 則該文件夾中就不存在以 ASPX 頁面名稱開頭的 XML 文件 例如 具有動態程序集的 sample aspx 頁面應有如下的條目

 sample aspx XXXXX xml

 XXXXX 占位符是壹種散列代碼 通過讀取該 XML 文件的內容 應用程序對象就可以了解要加載的程序集的名稱以及要在其中獲取的類 以下代碼片段是這種 Helper 文件的典型內容 包含 ASP sample_aspx 類的程序集的名稱是 mvxvx xr

<preserve assem= mvxvx xr type= ASP sample_aspx ><filedep name= c:\inetpub\root\vdir\sample aspx /></preserve>

 當然 只有在分析 filedep 文件的源代碼以生成動態程序集時才創建該文件 對 filedep 文件所做的任何更改都會使程序集無效 在下壹次請求時必須重新編譯 需要註意的是 在 ASP NET 架構的未來版本中 該實現過程可能會有較大改變 不論什麽原因 只要您決定在當前應用程序中使用它 都必須十分小心

 由於更新而要為頁面創建新的程序集時 ASP NET 將驗證是否可以刪除舊的程序集 如果舊的程序集只包含修改後的頁面的類 ASP NET 將試圖刪除並替換該程序集 否則將在保留舊程序集的情況下創建壹個新程序集

 在刪除過程中 ASP NET 可能會發現程序集文件已被加載並鎖定 這種情況下 可以為舊程序集添加壹個 DELETE 擴展名 以將其重新命名 (註意 所有 Windows 文件都可以在使用過程中重新命名 )只要應用程序重新啟動(例如 由於對某個應用程序文件如 global asax 和 web config 進行了更改) 這些臨時的 DELETE 文件就將被刪除 但在處理下壹個請求時 ASP NET 運行時不會刪除這些文件

 請註意 默認情況下 在整個應用程序重新啟動之前 每個 ASP NET 應用程序最多可以重新編譯 個頁面 同時會損失壹些會話和應用程序數據 當最近的編譯次數超過了 <Runtime> 部分的 numRepilesBeforeAppRestart 屬性中設置的閾值時 將卸載 AppDomain 並重新啟動應用程序 還要註意 在 NET Framework 中 您無法卸載單個程序集 AppDomain 是可以從 CLR 卸載的最小的代碼塊

  五 小結

 ASP NET 應用程序有兩大特征 進程模型和頁面對象模型 ASP NET 提前使用了 IIS 的壹些功能 而 IIS 則是 Windows Server 中提供的全新的 開創性的 Microsoft Web 信息服務 尤其值得壹提的是 在獨立的輔助進程中運行的 ASP NET 應用程序 其行為與 IIS 中的所有應用程序相同 而且 盡管會出現運行時異常 內存泄露或程序錯誤 ASP NET 運行時仍能自動回收輔助進程以保證實現卓越的性能 這種功能已成為 IIS 的系統功能

lishixinzhi/Article/program/net/201311/15766

  • 上一篇:電信詐騙有幾大類型
  • 下一篇:國內哪些廠家做醫保大數據平臺?
  • copyright 2024編程學習大全網