1.瀏覽器和伺服器的交互原理 答案是套接字:Socket。至於Socket的具體用法和原理,篇幅問題不在此文中寫了,先預留位置在這,下次補上《基於多線程和套接字的簡易WebServer軟體-沒有控制項的ASP.NET》。 瀏覽器和伺服器軟體通過套接字來發送和接收對方的信息,但現在的關鍵問題是,他們發送 ...
1.瀏覽器和伺服器的交互原理
- 通俗描述:我們平時通過瀏覽器來訪問網站,其實就相當於你通過瀏覽器去訪問一臺電腦上訪問文件一樣,只不過瀏覽器的訪問請求是由被訪問的電腦上的一個 WEB伺服器軟體來接收處理,它會分析接收到的請求信息,從而按照請求信息來找到伺服器電腦上的文件,經過處理,最終將生成的內容發回到瀏覽器。
- 簡單的說就是:由瀏覽器生成一條“命令”,通過互聯網發給另一臺電腦的某個軟體(伺服器軟體);伺服器軟體接收到“命令”,就分析理解這個“命令”,然後按照“命令”找到伺服器電腦上的文件,將文件內容發送回瀏覽器。
- 通過上圖,我們看到了瀏覽器和伺服器交互的簡單過程。現在,我們要想想,瀏覽器和伺服器軟體到底是神馬東東,他們之間又是如何交互信息的呢?
- 其實,瀏覽器和伺服器軟體,就是兩個獨立的應用程式(就如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方法。