1. 程式人生 > >ASP.NET之旅--深入淺出解讀IIS架構

ASP.NET之旅--深入淺出解讀IIS架構

 在學習Asp.NET時,發現大多數作者都是站在一個比較高的層次上講解Asp.net。 他們耐心、 細緻地告訴你如何一步步拖放控制元件、 設定控制元件屬性、編寫 CodeBehind程式碼,以實現某個特定的功能。這種做法,實際上是回答了“如何去做”的問題,卻沒有回答“為什麼可以這樣做”的問題。這樣有它的好處, 就是可以快速開發。 但建議多掌握一點底層知識,對一些問題會有更好的理解。希望通過這篇文章的,可以讓你更好的理解IIS和 Asp.Net的運作原理。

    思考“為什麼在位址列輸入 www.baidu.com就可以看到百度主頁?”類似於思考“為什麼蘋果是往地上掉不是往天上飄?”。 對於普通訪問者來說, 這就像每天太陽東邊升起西邊落下一樣是理所當然的。 對於很多程式設計師來說, 認為這個與己無關,不過是系統管理員或者網管員的責任。畢竟,IIS 是Windows的一個元件,又不是Asp.Net的一個組成部分。而實際上,從你輕拍回車到頁面呈現在你眼前的十分之一秒內,IIS 和.Net Framework已經做了大量的幕後工作,並且在IIS7.0以後的版本中Asp.net已經成為IIS的核心。

一、初識IIS

    IIS全稱為Internet Information Server(網路資訊服務管理器),它是微軟公司主推的Web伺服器。也就是說在理解IIS時首先我們應該把我們的電腦看做是一個網路伺服器,而IIS就是管理網路資訊的伺服器管理程式。

    IIS有了基本的理解後我們再來看一個完整的網路請求,如下圖:

    客戶端在請求網頁時首先要在網頁中輸入靜態的IP地址或者網站域名,經過域名解析後如果請求的地址存在且合法則請求的內容會發送到伺服器上。當伺服器接收到一個  Http 請求的時候,IIS  首先需要決定如何去處理這個請求(如:伺服器處理一個.htm 頁面和一個.aspx頁面肯定是不一樣的麼)。那 IIS 依據什麼去處理呢?答案是:根據檔案的字尾名。

    伺服器獲取所請求的頁面(也可以是檔案,如:sun.jpg)的字尾名以後,接下來會在伺服器端尋找可以處理這類字尾名的應用程式, 如果 IIS找不到可以處理此類檔案的應用程式,並且這個檔案也沒有受到伺服器端的保護(如:一個受保護的例子就是App_Code中的檔案, 一個不受保護的例子就是你的js指令碼),那麼 IIS 將直接把這個檔案返還給客戶端,如果IIS找到可處理的此類檔案的應用程式後會使用託管程式碼對它進行編譯,然後在返回到管道繼續執行,最後返還回客戶端。

    能夠處理各種字尾名的應用程式,通常被稱為ISAPI(在下面我們會講到)應用程式。雖然這ISAPI聽上去還挺氣派,也算是“應用程式”呢,但仔細看看它的全稱就明白了,它實際上只是一個介面,起到一個代理的作用,它的主要工作是對映所請求的頁面(檔案)和與此後綴名相對應的實際的處理程式。

    現在我們對網路請求有了初步的認識,但是還有很多疑問。IIS在收到HTTP請求後是如何對資訊進行解析處理的,它內部的工作原理又是什麼樣的。不要著急,接下來我們馬上說明。

二、再看IIS

    首先來看下IIS的基本構成。

    在向下解析IIS前我們要先認識些專有名字,這些名詞都是IIS內重要的組成部分。

  1、何為請求管道

    對於IIS的初級開發人員來說,請求管道是一個很新的名詞,它的作用和我們平常生活中所看到的管道是相同的,IIS在執行時會在應用程式池中建立一個執行管道,這個管道把HTTP的請求服務整合到了一起。

    那麼這個請求管道就是集成了HTTP請求所需要的所有步驟的內容。ASP.NET使用的就是管道模式來處理的HTTP請求。

  2、何為託管程式碼

    託管是NET的一個專門概念,它是一種程式設計理念,使用託管實現了對程式語言的相互轉化,可以說它是一種中間語言,等同於我們現實生活中的翻譯器,實現了程式語言的通用轉換,因此完全可以把“託管”視為“.NET”。

    託管程式碼也是如此,簡單點說,託管程式碼是微軟的中間語言,他主要的作用是在.NET的CLR執行程式碼前去編譯原始碼,也就是說託管程式碼充當著翻譯的作用,原始碼在執行時分為兩個階段:

      ① 原始碼編譯為託管程式碼;(所以原始碼可以有很多種,如VB,C#);

      ② 託管程式碼編譯為微軟系統的.net平臺專用檔案(如類庫、可執行檔案等)。

    它就好像是我們現實生活中的翻譯人員,兩個國家之間的語言往往是不同的,但是為了實現交流就必須由翻譯人員實現語言託管。

 3、何為ISAPI

    ISAPI是網路服務應用程式介面,全稱是Internet Server Application Programming Interface。仔細看看它的全稱就可以明白,它實際上只是一個介面,起到一個代理的作用。

    ISAPI主要分為ISA和ISAPIFilter兩部分。ISA方法相對而言要傳統一些,利用一些特殊的連結,指向伺服器的作業,供程式開發人員設計一些擴充套件功能;而ISAPI過濾器則傾向於構造伺服器直接呼叫的模組,提供一種無縫連結部件用於監測直接來自於伺服器的HTTP請求。

    簡單的講,ISAPI我們可以理解為一種語言編譯器。asp.net或其它程式語言檔案,如:PHP、JSP等傳輸到ISAPI後,根據副檔名的不同對映所請求的頁面(檔案),讓與此後綴名相對應的實際的處理程式來接管。由應用程式接管的,副檔名為.exe;由應用程式擴充套件接管的,副檔名為.dll。這種託管需要獲取指定語言的對映機制,一般為DLL檔案,例如:ASP對應的ISAPI對映為:"%SYSTEMROOT%\inetsrv\asp.dll"。

       

    在我們日常生活中這種請求機制隨意可見,公司的部門的分配就是很好的例項典範。當一項業務分配到該公司後,公司老闆會根據業務的不同來指定部門處理請求,老闆分配業務就是一種對映關係,各個部門收到指令後去處理業務就是一種程式碼的託管機制。

三、解讀IIS內部執行機制

    IIS7.0提供了兩種管道的託管模式,它們分別是:經典管道模式和整合管道模式。經典管道模式是IIS7.0以前的請求模式,這種模式擴充套件繁瑣,執行效率也比較低下。IIS7.0發生了翻天覆地的變化,就連底層的程式碼庫也是重新進行編寫的,但是微軟為了IIS的相容性,仍然為使用者儲存了經典的託管模式。

     如下圖為IIS兩種託管模式的執行機制:

 1、經典管道託管模式

    圖1中採用的是經典管道託管模式,HTTP進入請求管道後首先要進行身份驗證,驗證方式有多種,驗證完成後要確定執行處理程式,如果這個檔案是一個ASP.NET檔案,將執行託管,退出請求管道轉入ASP.NET ISAPI過濾器。通過ISAPI的處理後,這個請求還將返回管道,然後在向下請求管道,執行傳送響應,寫入請求日誌,並將請求資訊傳送給客戶端。

    圖1中,ASP.NET扮演了一個ISAPI過濾器的角色(ASP.NET只是ISAPI的一個外掛),也就是說,請求退出管道後,由aspnet.dll進行處理,然後返回到管道進行進一步處理,最終將響應返回給客戶端。

    這種經典的託管模式有很多缺點,其一,擴充套件繁瑣,開發人員要自己編寫程式執行所需要的ISAPI過濾器,但對於一般的程式猿來說這是很困難的時;其二,執行效率低,在執行ISAPI過濾時要退出請求管道執行應用程式實現過濾,增加了應用程式個數,浪費了記憶體空間;其三,安全性差。其中最主要的是安全問題,它在執行時要退出管道,查詢對映,如果被影射的DLL檔案不存在,則不能向下執行,導致執行出錯(常見的錯誤如:映射出錯)。雖然這種託管模式已被修改,但是IIS 7.0繼續提供了這種模式,主要是考慮到程式相容性問題,如果在整合模式下不能使用,可以遷移到經典模式中。

  2、整合管道託管模式              

    要想深入理解整合管道模式的好處,首先我們要了解整合的概念,整合是說把某一模組能夠作為處理的一個步驟加入其中,而且這種整合是非常靈活的,開發人員可以任意指定要整合的託管程式碼,如:ASP.NET、php等。

    此時在看整合的優勢就會發現,整合模式不僅增強了IIS的靈活性,而且使得HTTP請求模式更加安全。其一,整合模組的託管程式碼可以由開發人員自行制定,並且模組可以成為管道的組成部分;其二,它去除了複雜的ISAPI的對映託管過程,在請求時可以 直接由相應的編譯環境來執行請求,使得編譯過程更加安全。ASP.NET的效能之所以能夠得到改善,也是因為ASP.NET應用程式整合到管道中,在請求時不再需要退出管道並載入ISAPI程序來處理ASP.NET程式碼,然後再返回到管道為客戶提供響應資訊。        

    如果我們把ASP.NET整合到IIS管道中,那麼此時ASP.NET就成為IIS7.0的核心。可以在管道中處理ASP.NET檔案,這樣可以在處理過程的任意一個步驟使用ASP.NET程式碼。因為ASP.NET已經成為管道的一部分了。所以,諸如身份驗證之類的ASP.NET功能也可以用於處理非ASP.NET內容(如:StaticFile、Image、HTML等)。每個請求都可以由IIS和ASP.NET進行處理,而不必考慮其所屬型別。

四、應用程式池、應用程式和虛擬目錄

    管道模式是針對應用程式池的,IIS在工作時會在應用程式池中建立請求管道,簡單的講應用程式池是用來存放請求管道的。在建立網站時會建立一個應用程式我們稱之為根應用程式,使用(/)表示,同時也預設建立該網站的應用程式池,但是我們也可以為請求管道隨意指定應用程式池,同時也修改了應用程式所在的應用程式池。也就是說應用程式的執行是基於HTTP請求管道的。

    虛擬目錄是一個指標,它指向了本地實體地址或者遠端伺服器上的某個地址。在建立應用程式時會預設建立一個虛擬目錄,那就是應用程式所指的根虛擬目錄,也用(/)表示。

    應用程式是由一些檔案和資料夾組成的集合,這些檔案和資料夾可以通過諸如HTTP或HTTPS等協議為外界提供服務。一個應用程式下可以指向多個本地實體地址,也就是可以建立多個虛擬目錄。

    一個應用程式池中可以包括多個應用程式。每個網站至少包括一個應用程式(一個網站就是一個應用程式),即根應用程式,但是在必要情況下,一個網站可以包括多個應用程式。

    它們之間的關係如下圖:

    所以它們四者的關係就很明顯了應用程式池-->HTTP管道-->應用程式-->虛擬目錄。

    這種關係就相當於Windows系統中的資料夾和快捷方式之間的關係,我們可以把磁碟看做一個應用程式池,資料夾看做一個應用程式,而虛擬目錄就相當於資料夾內的快捷方式。如果我們想要在資料夾中訪問一個檔案但又不想讓檔案儲存在資料夾下,這時我們可以通過快捷方式來實現。我們通過快捷方式能夠實現快捷訪問資料夾中的內容,且不用指定安全級別。

五、思想昇華

    學習就好像VS中的錯誤處理機制一樣,遇到問題時就向上拋,拋的越高我們看的東西越廣,同樣的道理站得高才能看得遠。在學習時我們可以嘗試多問為什麼,只知道“如何去做”,不知道“為什麼這樣做”,那我們永遠學不到知識的精髓。

   (本文只對IIS架構進行了一些初步的解讀,如果想進一步研究IIS架構,為大家推薦一本書《IIS7開發與管理完全參考手冊》,這本書深入研究了IIS7.0的架構及其新特性,在此基礎上深入介紹瞭如何高效地管理IIS7.0。對IIS架構的熟知也是Web伺服器管理員的必備課程。該書有翻譯版本的,看了後感覺翻譯的不錯,幫助很大,如果不想買的話為大家提供個看書的連結:http://book.51cto.com/art/200908/146040.htm。)

相關推薦

ASP.NET--深入淺出解讀IIS架構

 在學習Asp.NET時,發現大多數作者都是站在一個比較高的層次上講解Asp.net。 他們耐心、 細緻地告訴你如何一步步拖放控制元件、 設定控制元件屬性、編寫 CodeBehind程式碼,以實現某個特定的功能。這種做法,實際上是回答了“如何去做”的問題,卻沒有回答“為

Asp.net】--資料繫結控制元件Repeater

引言         前幾篇的文章在說AJAX的內容,利用AJAX技術能夠開發出高效執行的網站應用程式,不過在進行B/S專案開發時只擁有AJAX技術是遠遠不夠的,踏入到B/S要學的東西會更多,但相較C/S的複雜邏輯結構來說B/S在開發時還是很簡單的。         在開

ASP.NET--淺談Asp.net的執行機制(二)

      上節中我們從Http請求在Asp.net中的執行過程進行了分析,但是對於真正核心的東西我們並沒有說明,那接下來我們將問題上拋,從底層類和物件的建立層面上來看Asp.net的執行機制。 三、Asp.net底層執行機制    1、理解HTTP.SYS      

Asp.net】--資料繫結控制元件DataList

       上篇部落格討論了Repeater控制元件的基本用法,它是最基本的資料繫結控制元件,只提供了資料繫結的功能,熟練運用Repeater控制元件後,其它類似的資料繫結控制元件就很簡單了。接著我們上篇部落格的內容繼續,今天來討論下DataList的基本使用方法。

ASP.NET--淺談Asp.net執行機制(一)

       很多Asp.net開發人員都有過Asp的背景,以至於我們開發程式的時候總是停留在“頁面”層次思考,也就是說我們常常會只考慮我們現在所做的系統是要完成什麼功能,是要做問卷調查網站還是個人網站,而很少在“請求級”思考,思考能不能通過編碼的方式來操作一個Http請

ASP.netHttpModel 和httpHandle 之一

結束 nethttp get nth send 信息 來講 不同 pmod HttpModule是向實現類提供模塊初始化和處置事件。當一個HTTP請求到達HttpModule時,整個ASP.NET Framework系統還並沒有對這個HTTP請求做任何處理,也就是說此時

Asp.Net DropDownList的使用

案例 easy orm val eas box lis base field 這裏不細說,直接上案例 <td style="width: 30px;" align="right"> 年月: </td> <td> <asp:Drop

Asp.Net 禁用TextBox的記憶功能

信息安全意識 一次 禁止 屬性 網吧 inpu 用戶登錄 tex 問題   IE提供了一個自動完成功能可以記憶我們的輸入內容(如登錄帳號等),方便下一次快速地錄入類似資料。這確實是一個非常友好的功能,在操作時只需用鼠標雙擊文本框或輸入前幾個字符,系統會自動列出以前的錄入歷史

asp.netcookie

color quest div 獲取cookie cnblogs tpc .net http 創建cookie 1.創建cookie HttpCookie userCookie = new HttpCookie("userInfo"); userCookie["name"

Android開發3:android架構

通過 圖集 例如 sqlit 組件 mil 大小 簡化 .html 引言 通過前面兩篇: Android 開發之旅:環境搭建及HelloWorld Android 開發之旅:HelloWorld項目的目錄結構 我們對android有了個大

ASP.NET Core 的Windows和IIS宿主(自動翻譯記錄)

href imei when webserver cif outside 連接 cor ole https://docs.microsoft.com/en-us/aspnet/core/publishing/iis?tabs=aspnetcore2x 支持的操作系統 以下操

ASP.NET EntityFramework實體框架搭建

一個 eric null ron config .com span gif div   前段時間接觸了EntityFramework,對ORM框架也是有了初步的認識,現在對其進行一點小總結。 一、ORM簡介   對象關系映射(Object Relationa

asp.net購物車

buy1.aspx <body> <form id="form1" runat="server"> <asp:CheckBox ID="C1" runat="server" Text="豬肉" /> <br /> &l

ASP.NETRepeater控件

repeater alt asp.net info .com 分享圖片 分享 net eat ASP.NET之Repeater控件

Asp.Net 二維碼生成

  首先,引用 ThoughtWorks.QRCode.dll 。   簡單二維碼生成及解碼程式碼:      //生成二維碼方法一 private void CreateCode_Simple(string nr) {

vscode建立的asp.net core專案部署到IIS

一、釋出專案 在visual studio code中通過命令“dotnet publish”,如下圖:  這裡我把釋出位置設定到了D:\WebSite\netcoredemo下。   二、設定IIS 0、安裝AspNetCoreModule託管模組,安裝後在iis的“模組”

asp.netWeb Form】編寫抽象工廠資料庫操作類

理解抽象工廠 在ADO.NET對SqlServer,Mysql等的操作步驟類似,不同的是: SqlServer的操作使用的是SqlConnection、SqlCommand,SqlDataAdapter; MySql使用的是MySqlConnection、

ASP.NET Process Model之一:IISASP.NET ISAPI

上影象我們展示了IIS 5.x如何處理一個基於ASP.NET Resource(以aspx為例)的Http Request的大體流程。首先使用者通過Browser請求一個aspx page,Brower向對於得Web Server,也就是目標主機的IIS。在上面我們提到過,IIS執行在一個稱為Inet

ASP.NETAJAX主要控制元件

AJAX是綜合非同步通訊,JavaScript以及XML等多種網路技術新的程式設計方式。 ScriptManager 控制元件 是ASP.NET AJAX的核心,它提供AJAX其他所有控制元件的支援,沒有ScriptManager的存在AJAX是不可以工作的,並且支援AJAX的頁面只

ASP.NET頁面間資料傳遞

頁面傳值 1.QueryString傳遞資料 通過QueryString傳遞資料,要把傳遞的資料引數新增到要跳轉到的頁面的url之後,用?分隔開url和第一個引數分隔開,後面引數用&分隔。 http://www.tengxun.com?ID=7&Name=yokei