ASP.NET 運行機制詳解

来源:http://www.cnblogs.com/smiler/archive/2017/02/25/6441557.html
-Advertisement-
Play Games

1.瀏覽器和伺服器的交互原理 答案是套接字:Socket。至於Socket的具體用法和原理,篇幅問題不在此文中寫了,先預留位置在這,下次補上《基於多線程和套接字的簡易WebServer軟體-沒有控制項的ASP.NET》。 瀏覽器和伺服器軟體通過套接字來發送和接收對方的信息,但現在的關鍵問題是,他們發送 ...


1.瀏覽器和伺服器的交互原理

  1. 通俗描述:我們平時通過瀏覽器來訪問網站,其實就相當於你通過瀏覽器去訪問一臺電腦上訪問文件一樣,只不過瀏覽器的訪問請求是由被訪問的電腦上的一個 WEB伺服器軟體來接收處理,它會分析接收到的請求信息,從而按照請求信息來找到伺服器電腦上的文件,經過處理,最終將生成的內容發回到瀏覽器。
  2. 簡單的說就是:由瀏覽器生成一條“命令”,通過互聯網發給另一臺電腦的某個軟體(伺服器軟體);伺服器軟體接收到“命令”,就分析理解這個“命令”,然後按照“命令”找到伺服器電腦上的文件,將文件內容發送回瀏覽器。

image

  1. 通過上圖,我們看到了瀏覽器和伺服器交互的簡單過程。現在,我們要想想,瀏覽器和伺服器軟體到底是神馬東東,他們之間又是如何交互信息的呢?
  2. 其實,瀏覽器和伺服器軟體,就是兩個獨立的應用程式(就如qq、office、畫圖工具一樣)。那麼兩個應用程式之間要交互信息,就牽扯到了應用程式通信的問題。那他倆是使用神馬方式通信的呢?
  • 答案是套接字:Socket。至於Socket的具體用法和原理,篇幅問題不在此文中寫了,先預留位置在這,下次補上《基於多線程和套接字的簡易WebServer軟體-沒有控制項的ASP.NET》。
  • 瀏覽器和伺服器軟體通過套接字來發送和接收對方的信息,但現在的關鍵問題是,他們發送和接收的到底是什麼?--- 基於Http協議的報文數據(詳見《Http協議介紹---沒有控制項的ASP.NET》)。
  • 也就是說:瀏覽器和伺服器軟體其實就是兩個使用Socket進行通信的的兩個應用程式:雙方都發送按照 Http協議語法規範組織的數據,接收到數據後都按照 Http協議語法規範來解釋。

    2.瀏覽器和IIS(or other webserver)交互機制

上圖就是IIS (伺服器軟體)

1.瀏覽器和IIS交互過程:
我們都知道,在互聯網上確定一臺電腦的位置是使用IP定址,但為什麼當我們平時訪問網站時直接輸入一個功能變數名稱也能夠訪問到某個伺服器電腦進而由對方的伺服器軟體發送響應頁面數據給我呢?下麵我把簡單步驟列出:

(1)在瀏覽器輸入網址:www.oumind.com/index.html,瀏覽器按照Http協議語法 生成請求報文數據。

(2).瀏覽器檢查本機是否保存了www.oumind.com/index.html.功能變數名稱對應的伺服器IP地址。如果沒有,則發送請求到所在城市網中最近的DNS伺服器(功能變數名稱解析伺服器),它會根據我們發送來的功能變數名稱查詢到該功能變數名稱對應的伺服器IP地址,併發送回瀏覽器。

(3)瀏覽器從DNS伺服器獲得了 www.oumind.com/index.html功能變數名稱對應的伺服器電腦IP,則將 請求報文 通過Socket發送到伺服器電腦。(註意:Http協議 規定伺服器軟體使用的預設埠是80,通俗的說,就是如果瀏覽器訪問一個網站頁面,瀏覽器預設就是將 請求報文 發送到伺服器80埠,而伺服器負責監聽這個埠的軟體一般就是伺服器軟體—比如asp.net用的IIS,java用的Tomcat。)

(4)IIS接收到 請求報文,分析請求報文,從中獲取請求的頁面路徑 /index.html。判斷頁面的尾碼名,如果是靜態頁面(.html/.jpg/.css/.js等),則直接由IIS軟體的組件讀取該文件內容,並將內容通過Socket發送回瀏覽器。

(5)但如果此時請求的是一個動態頁面(.aspx/.ashx),IIS自己就處理不了 (因為IIS軟體開發出來的時候,ASP.NET程式還不存在呢) 。所以,IIS就去它的 擴展程式映射表 中根據被請求文件尾碼名 查看是否有能夠處理這種文件的擴展程式。

而我們ASPNET中常用的文件.aspx/.ashx等 對應的處理程式是aspnet_isapi.dll。如下圖:

(6)如果IIS根據尾碼名找到對應的處理程式,則通過調用此程式來處理瀏覽器發送來的請求報文。

IIS自身是不能處理像ASPX擴 展名這樣的頁面,只能直接請求像HTML這樣的靜態文件,之所以能處理ASPX這樣擴展名的頁面,是因為IIS有一個ISAPI過濾器,它是一個COM組件。

ASP.NET服務在註冊到IIS的時候,就會添加一個Win32的擴展動態庫aspnet_isapi.dll。並將擴展可以處理的頁面擴展名(如 ASPX)註冊到IIS裡面。擴展啟動後,就根據定義好的方式來處理IIS所不能處理的頁面。

當客戶端請求一個伺服器資源時,這個HTTP請求會被inetinfo.exe進程截獲(www服務),然後Check請求資源的類型,並依據資源映射信息(存儲在IIS元庫中,一種IIS專用的配置資料庫)將請求的資源分配給特定的處理程式模塊。若請求的是靜態資源(img,text,html等)則由IIS處理(IIS在本地Web Server上訪問請求的文件),將內容輸出到控制台,發出請求的瀏覽器就能接收到它了。

若需要在伺服器端處理的請求,則會被傳到已註冊的擴展模塊 中,aspx請求會被分配給aspnet_isapi.dll,讓這個程式開始處理代碼,生成標準的HTML代碼,然後將這些HTML加入到原有的 HTML中,最後把完整的HTML返回給IIS,IIS再把內容發送到客戶瀏覽器。

ASP.NET FrameWork對請求的處理

上面說到IIS將像ASPX這樣的頁面分配給aspnet_isapi.dll,接著處理如下:

1、aspnet_isapi.dll則會 通過一個Http PipeLine的管道將這個Http請求發給w3wp.exe(iis 工作者進程,IIS6.0中叫做 w3wq.exe,IIS5.0中叫做 aspnet_wp.exe),之後asp.net framework就會通過HttpRuntime來處理這個Http請求。

2、HttpRuntime首先會確定處理該請求的類名,HttpRuntime通過公共介面IHttpHandler來調用該類獲取被請求資源的類的實例。

3、調用HttpRuntime.ProcessRequest開始處理要發送到瀏覽器的頁面,具體說就是創建一個HttpContext實例,它封裝了所有與請求有關的http特有的信息,並初始化一個Write對象用於緩存標記代碼。

4、HttpRuntime使用上下文信息查找或新建能處理該請求的WEB應用程式的對象。由HttpApplication Factory負責返回HttpApplication實例。

5、HttpApplication實例會讀取web.config中所有HttpModule的配置。

6、HttpApplication對象使用IHttpHandlerFactory類型的實例返回HttpHandler(http處理程式)給HttpRuntime對象。一個頁面只是個http處理程式對象。
7、最後由HttpRuntime對象調用IHttpHandler的頁面對象的ProcessRequest方法。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 年前經常聊天的大佬群里有人寫了窗體的倒計時來計算下班時間和放假時間:) 簡直就是在嘲諷我這種沒有工作的人,哈哈哈 窗體的倒計時相當的沒有技術含量,主要是不夠炫酷,不能夠體現我們程式員的身份。 那什麼才叫炫酷?必須是控制台啊! 電視劇上黑客噼里啪啦噼里啪啦滾屏的畫面多炫酷! 所以,研究了一下怎麼樣在控 ...
  • 適用Zero版本:ASP.NET Core & Angular 2+ (aspnet-zero-core-3.1.0)。 該版本官方有兩個solution文件夾:Angular(前端) 和 aspnet-core(後臺服務)。 在開始以下步驟之前需要能夠成功發佈程式,對於後臺服務只要能運行即可,如有 ...
  • 註釋,是代碼中的一些“說明性文字”。註釋本身不會參與程式的編譯和運行,僅僅供程式員閱讀。 註釋分為:單行註釋、多行註釋、文檔註釋。 單行註釋的符號是2條斜線“//”,2條斜線右側的內容就是註釋,左側的代碼不會受影響。 多行註釋以“/*”開始,以“*/”結束,之間的內容就是註釋,可以包含多行。 文檔註 ...
  • OSS最新進度,包括OSS.Social,OSS.Http,新增微信支付項目OSS.PayCenter。 ...
  • 簡介 RabbitMQ:一個消息系統,基於 AMQP 系統協議,由 erlang 語言開發。 優點:健壯、使用簡單、開源和支持各種流行的語言等。 MQ(Message Queue):消息隊列的簡稱,是一種應用程式之間的通信機制。 作用:將部分無需立即回調獲取結果,並且耗時的操作,使用非同步處理的方式提 ...
  • 在開發商城系統的時候,大家會遇到這樣的需求,商城系統里支持多種商品類型,比如衣服,手機,首飾等,每一種產品類型都有自己獨有的參數信息,比如衣服有顏色,首飾有材質等,大家可以上淘寶看一下就明白了。現在的問題是,如果我程式發佈後,要想增加一種新的商品類型怎麼辦,如果不在程式設計時考慮這個問題的話,可能每 ...
  • 1..NET Core基本介紹 a 作為一個.NET的開發者,在以前的開發中,我們開發的項目基本都是部署在windows伺服器上,但是在windows伺服器上的話某些比較流行的解決訪問量的方案基本都是先出現在linux上,而後才能遷移出現windows上,而且效率處理方面也不再一個級別。曾經讓.NE ...
  • 一. 場景介紹: 如題如何有效的,最少量的現有代碼侵入從而實現客戶端與伺服器之間的數據交換加密呢? 二. 探究: 1.需求分析 webapi服務端 有如下介面: public class ApiTestController : ApiController { // GET api/<controll ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...