文章出處

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方法。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()