Asp.Net 請求處理機制

来源:http://www.cnblogs.com/shouce/archive/2016/01/13/5126140.html
-Advertisement-
Play Games

原文:http://www.cnblogs.com/cilence/archive/2012/05/28/2520712.htmlAsp.Net 請求處理機制前言我們都知道Web請求響應是基於Http協議,那麼我們可以這樣來理解,一次Web請求和響應的過程,實際上就是一次發送Http請求和接收Htt...


原文:http://www.cnblogs.com/cilence/archive/2012/05/28/2520712.html

 

Asp.Net 請求處理機制   前言 我們都知道Web請求響應是基於Http協議,那麼我們可以這樣來理解,一次Web請求和響應的過程,實際上就是一次發送Http請求和接收Http響應的過程。 客戶端向伺服器發送一次Http請求,伺服器端接收到這次請求,並生成響應報文 ,將響應報文發送回客戶端。這樣客戶端和伺服器端就完成了一次Web交互。   什麼是Asp.Net呢? 我喜歡把Asp.Net定義如: Asp.Net 是一個運行在CLR的托管代碼上,從前到後處理Web請求,並響應Web請求的一個AOP框架,它是處理Web請求的一種引擎。它不是僅僅是我們常用的WebForm,WebService,IHttpHandler這些,它還有很多.....     從瀏覽器到伺服器的過程 我們來看一下,當我們在瀏覽器地址欄輸入http://www.cnblogs.com博客園的網址時,並敲擊回車鍵。這個時候就會從瀏覽器端生成一個Request請求,併發送給http://www.cnblgos.com的web伺服器 ,當請求到達web伺服器的那一刻,web伺服器Windows內核中的HTTP.SYS組件就會捕獲到請求。當HTTP.SYS組件分析到這是一個需要交給IIS伺服器處理的Http請求時,HTTP.SYS組件就會將Request請求,交給IIS伺服器來處理。IIS伺服器分析Request請求的context-type類型,然後從處理程式映射表中去匹配,當在處理程式映射表中能夠匹配到Request請求的context-type類型時,那麼IIS伺服器就將請求交給映射表中所對應的程式處理。 圖一 : IIS中 處理程式映射表 當IIS發現,在處理程式映射表中沒有能匹配的項的時候(當沒有匹配項的時候,一般情況下是請求"靜態文件"),就直接去下載Request請求所對應路徑的文件。如.jpg,html,xml.css文件等等。 圖二 : 從瀏覽器到達伺服器的過程   回到之前,當伺服器在處理如aspx.ashx,等等動態文件的時候,IIS伺服器將Request請求,交 給aspnet_isapi.dll文件來處理。   ISAPI是第一個也是性能最高Request請求報文最原始的Web請求切入點 aspnet_isapi.dll是一個非常底層,並且是非托管的win32API,這個dll非常簡單,非常高效,並且還被微軟優化過性能。它用來處理最底層的 指令以及函數回調,併為高層程式提供了應用程式級別服務的功能和介面。 當aspnet_isapi.dll接收到Request請求的時候,aspnet_isapi.dll就會去調動Web伺服器中的.Net Framework,最終載入CLR運行環境,並創建一個ISAPIRuntime對象,然後調用ISAPIRuntime對象的ProcessRequest()方法。 ISAPIRuntme.ProcessRequest()方法是進入ASP.Net的第一個入口 ISAPIRuntime.ProcessRequest()方法調用之後主要做了一件事情,就是將Request的原始請求信息封裝成HttpWorkRequest類,由於HttpWorkRequest類封裝的請求報文很原始,很複雜,所以微軟沒有將其公開出來。接著執行StartProcessing()方法,來創建HttpRuntime對象並調用其靜態方法ProcessRequest()。 圖三 : 如何開始ASP.Net HttRuntime,HttpContext,HttpApplication ?   在HttpRuntime對象調用其靜態方法ProcessRequest()之後,我們的Web請求開始慢慢進入應用層級別,why? ProcessRequest()這個方法做了很多事情,具體可以通過Reflector工具查看,但是大致分為四個部分: 1.為請求創建了一個新的HttpContext實例(這個對象就是我們常用的HttpContext上下文對象),並將HttpWorkRequest中最原始的請求 報文封裝到HttpContext對象的HttpRequest對象中。 2.通過HttpApplicationFactory(應用程式工廠)得到一個具體的HttpApplication 實例。 3.調用HttpApplication.Init()方法來建立事件請求管道。 4.Init()方法觸發了HttpApplication.ResumeProcessing()方法來開始執行Asp.Net事件請求管道。 圖四 : HttpRuntime,HttpApplication和HttpContext的關係 Asp.Net事件請求管道詳解   前面說Asp.Net是一個Aop框架,而Asp.Net事件請求管道就是一點。 Asp.Net事件請求管道,是微軟幫程式員提供來處理Web請求的一些列事件,這些事件是依次執行,我們可以通過在這些事件上註冊或移除我們自己寫的方法,來修改Web請求執行的邏輯。   圖五 : ASP.Net事件請求管道   在第八個事件的時候,會創建請求的頁面對象,並轉換為IHttpHandler介面。   在第九個事件到第十一個事件之間,會接收到瀏覽器發過來的SessionId。並先會將IHttpHandler介面嘗試轉換為IRequiresSessionState介面,如果轉換成功,Asp.Net會根據這個SessionId到伺服器的Session池中去查找所對應的Session對象,並將這個Session對象賦值到HttpContext對象的Session屬性。如果嘗試轉換為IRequiresSessionState介面不成功,則不載入Session。   在第十一個事件到第十二個事件之間,會調用在第八個事件創建的頁面對象的ProcessRequest方法。 當我們直接使用*.ashx頁面的時候,就直接調用了一個FrameworkInitialize(),並最終生成響應報文,發送回客戶端。 當我們在使用*.aspx頁面的時候,它繼承自Page類,而Page類實現了IHttpHandler介面。 由於Page類實現了IHttpHandler介面,在ProcessRequest方法中,調用了FrameworkInitialize()方法。 在FrameworkInitialize()這個方法內部就開始打造Asp.Net的頁面控制項樹(打造html樹),在其中就調用了ProcessRequestMain方法,在這個方法裡面就執行了整個Asp.Net頁面生命周期。   IHttpModules 請求通過事件管道,一些列的事件被觸發了,我們可以通過在Global.asax全局配置文件中看到這些事件。 但是由於這是由程式分配的事件,可能就不是我們想要的。如果我們想要創建一個能夠復用的HttpApplication事件管道來處理Web請求, 我們又想將這些代碼復用,或者開發成插件的形式。那麼我們就可以使用IHttpModules。 IHttpModules配置很簡單,我們只需要在Web.config裡面配置一下就可以了。而具體的HttpModules只需要實現IHttpModules介面,並註冊自己的方法就行了。   <?xml version="1.0"?>   <configuration>     <system.web>         <httpModules>             <add name="cnblogsHttpModules" type="cnblogs.cnblogsHttpModules"/>         </httpModules>     </system.web> </configuration>   Web.config文件的配置     publicclass cnblogsHttpModules : IHttpModule {     public void MyBeginRequest(object sender, EventArgs e)     {         HttpApplication application = sender as HttpApplication;         application.Context.Response.Write("這個IHttpModule具體類的寫法喲!");     } }   具體的HttpModules類寫法   Asp.Net頁面生命周期詳解 Asp.Net是一個Aop框架,而Asp.Net事件請求管道體現了Aop思想,而現在我們要說的Asp.Net頁面生命周期也體現Aop思想。 Asp.Net頁面生命周期的本質就是微軟提供給我們程式員修改頁面控制項樹代碼的一些列事件,我們可以通過實現頁面生命周期的事件方法來修改控制項樹代碼。 圖六 : ASP.Net頁面生命周期   當ASP.Net執行完我們註冊的生命周期事件方法的時候,最後會調用Render方法,Render方法要求傳入一個TextWriter文本寫出器對象,並遍歷所有控制項樹,調用每個控制項的Render方法。 所以每一個控制項調用Render方法之後產生的Html字元串都依次寫入到TextWriter對象。最後ASP.Net將TextWriter中的Html字元串封裝成響應報文,然後發送回客戶端。     結束語 在這裡,我介紹了一下ASP.Net的整個處理請求的過程。但有很多底層的信息,我還沒有仔細去觀察過,因此很多細節可能還是沒有註意到。這篇文章可能還是有很多錯誤的地方,希望博客園的兄弟姐妹們糾錯,謝謝。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先奉獻caching的開源地址[微軟源碼]1.工程架構為了提高程式效率,我們經常將一些不頻繁修改,但是使用了還很大的數據進行緩存。尤其是互聯網產品,緩存可以說是提升效率優化第一利器。微軟為我們實現了倆種緩存方式:記憶體緩存、分散式緩存。個人理解如果緩存在前端電腦記憶體的緩存叫做記憶體緩存,如果緩存在其它...
  • 1、許可權問題解決辦法:更改網站許可權,添加“IIS_IUsers”和“Users”兩個用戶的完全許可權2、framework版本問題更改應用程式池 版本4.0,管道經典3、“無法啟動應用程式池”錯誤打開服務,啟動Windows Process Activation Service服務4、“無法啟動網站”...
  • 有combox控制項,命名為cbxPutStatus,在程式中為其手工定義數據源,並綁定 private void POrderSplitFrm_Load(object sender, EventArgs e) { //綁定定單狀態 this.cbxPutStatus.DataSource = Dat...
  • powershell對txt文件的伺服器進行ping操作,txt文件有幾百台伺服器要進行Ping操作。每行一個#//*************************************************************#//編輯人:#//編輯單位:#//編輯作用:ping#//編...
  • 本節講Asp.net 5的緩衝。解決方案可以通過網址:https://github.com/aspnet/Caching下載也是Asp.net 5開源代碼介紹的第6部分,前5部分鏈接如下: 1. DependencyInjection(依賴註入)項目代碼分析 2. Configuration 新.....
  • 數據結構,無外乎三:1. 一對一,線性表,數組是也;2. 一對多,樹,菜單是也;3. 多對多,圖,網路是也。涉及到樹,有一個平衡的問題,左旋轉,右旋轉,轉得人暈暈乎乎。好在陳廣的《數據結構C#描述》講解非常詳盡,值得一讀。對照該書的例子,採用反編譯的手段,寫了個小程式,主要的目的是為了學習方便,也便...
  • C#中的yield可以應用在一個可迭代的方法中,我們必須真正理解此關鍵詞,才能將它正確的應用到實際生產中。為了說明yield會出現讓我們迷惑的結果,下麵先定義一個MyObject類:1 class MyObject2 {3 public int Value{get;...
  • 作者:SmlAnt出處:http://www.cnblogs.com/smlAnt一、概述String是我們平常用得最多的基元類型之一,雖然我們經常使用而且感到非常熟悉;但很多朋友只知道一個字元串的定義、使用或知道如何使用StringBuilder來達到高效構建字元串,但是有多少朋友有興趣去瞭解背後...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...