asp.net运行机制
ASP.NET運(yùn)行機(jī)制原理
---瀏覽器與IIS的交互過(guò)程
一、瀏覽器和服務(wù)器的交互原理
? (一)、瀏覽器和服務(wù)器交互的簡(jiǎn)單描述:
1.通俗描述:我們平時(shí)通過(guò)瀏覽器來(lái)訪問(wèn)網(wǎng)站,其實(shí)就相當(dāng)于你通過(guò)瀏覽器去訪問(wèn)一臺(tái)電腦上訪問(wèn)文件一樣,只不過(guò)瀏覽器的訪問(wèn)請(qǐng)求是由被訪問(wèn)的電腦上的一個(gè) WEB服務(wù)器軟件來(lái)接收處理,它會(huì)分析接收到的請(qǐng)求信息,從而按照請(qǐng)求信息來(lái)找到服務(wù)器電腦上的文件,經(jīng)過(guò)處理,最終將生成的內(nèi)容發(fā)回到瀏覽器。
簡(jiǎn)單的說(shuō)就是:由瀏覽器生成一條“命令”,通過(guò)互聯(lián)網(wǎng)發(fā)給另一臺(tái)電腦的某個(gè)軟件(服務(wù)器軟件);服務(wù)器軟件接收到“命令”,就分析理解這個(gè)“命令”,然后按照“命令”找到服務(wù)器電腦上的文件,將文件內(nèi)容發(fā)送回瀏覽器。
2.通過(guò)上圖,我們看到了瀏覽器和服務(wù)器交互的簡(jiǎn)單過(guò)程。現(xiàn)在,我們要想想,瀏覽器和服務(wù)器軟件到底是神馬東東,他們之間又是如何交互信息的呢?
其實(shí),瀏覽器和服務(wù)器軟件,就是兩個(gè)獨(dú)立的應(yīng)用程序(就如qq、office、畫(huà)圖工具一樣)。那么兩個(gè)應(yīng)用程序之間要交互信息,就牽扯到了應(yīng)用程序通信的問(wèn)題。那他倆是使用神馬方式通信的呢?
答案是套接字:Socket。至于Socket的具體用法和原理,篇幅問(wèn)題不在此文中寫(xiě)了,先預(yù)留位置在這,下次補(bǔ)上《基于多線程和套接字的簡(jiǎn)易WebServer軟件-沒(méi)有控件的ASP.NET》。
瀏覽器和服務(wù)器軟件通過(guò)套接字來(lái)發(fā)送和接收對(duì)方的信息,但現(xiàn)在的關(guān)鍵問(wèn)題是,他們發(fā)送和接收的到底是什么?--- 基于Http協(xié)議的報(bào)文數(shù)據(jù)(詳見(jiàn)《Http協(xié)議介紹---沒(méi)有控件的ASP.NET》)。
也就是說(shuō):瀏覽器和服務(wù)器軟件其實(shí)就是兩個(gè)使用Socket進(jìn)行通信的的兩個(gè)應(yīng)用程序:雙方都發(fā)送按照 Http協(xié)議語(yǔ)法規(guī)范組織的數(shù)據(jù),接收到數(shù)據(jù)后都按照 Http協(xié)議語(yǔ)法規(guī)范來(lái)解釋。
?
(二)、瀏覽器和IIS(or other webserver)交互機(jī)制
上圖就是IIS (服務(wù)器軟件)
1.瀏覽器和IIS交互過(guò)程:
我們都知道,在互聯(lián)網(wǎng)上確定一臺(tái)電腦的位置是使用IP尋址,但為什么當(dāng)我們平時(shí)訪問(wèn)網(wǎng)站時(shí)直接輸入一個(gè)域名也能夠訪問(wèn)到某個(gè)服務(wù)器電腦進(jìn)而由對(duì)方的服務(wù)器軟件發(fā)送響應(yīng)頁(yè)面數(shù)據(jù)給我呢?下面我把簡(jiǎn)單步驟列出:
(1)在瀏覽器輸入網(wǎng)址:www.oumind.com/index.html,瀏覽器按照Http協(xié)議語(yǔ)法 生成請(qǐng)求報(bào)文數(shù)據(jù)。
(2).瀏覽器檢查本機(jī)是否保存了www.oumind.com/index.html. 域名對(duì)應(yīng)的服務(wù)器IP地址。如果沒(méi)有,則發(fā)送請(qǐng)求到所在城市網(wǎng)中最近的DNS服務(wù)器(域名解析服務(wù)器),它會(huì)根據(jù)我們發(fā)送來(lái)的域名查詢到該域名對(duì)應(yīng)的服務(wù)器IP地址,并發(fā)送回瀏覽器。
(3)瀏覽器從DNS服務(wù)器獲得了 www.oumind.com/index.html域名對(duì)應(yīng)的服務(wù)器電腦IP,則將 請(qǐng)求報(bào)文 通過(guò)Socket發(fā)送到服務(wù)器電腦。(注意:Http協(xié)議 規(guī)定服務(wù)器軟件使用的默認(rèn)端口是80,通俗的說(shuō),就是如果瀏覽器訪問(wèn)一個(gè)網(wǎng)站頁(yè)面,瀏覽器默認(rèn)就是將 請(qǐng)求報(bào)文 發(fā)送到服務(wù)器80端口,而服務(wù)器負(fù)責(zé)監(jiān)聽(tīng)這個(gè)端口的軟件一般就是服務(wù)器軟件—比如asp.net用的IIS,java用的Tomcat。)
(4)IIS接收到 請(qǐng)求報(bào)文,分析請(qǐng)求報(bào)文,從中獲取請(qǐng)求的頁(yè)面路徑 /index.html。判斷頁(yè)面的后綴名,如果是靜態(tài)頁(yè)面(.html/.jpg/.css/.js等),則直接由IIS軟件的組件讀取該文件內(nèi)容,并將內(nèi)容通過(guò)Socket發(fā)送回瀏覽器。
(5)但如果此時(shí)請(qǐng)求的是一個(gè)動(dòng)態(tài)頁(yè)面(.aspx/.ashx),IIS自己就處理不了 (因?yàn)?/span>IIS軟件開(kāi)發(fā)出來(lái)的時(shí)候,ASP.NET程序還不存在呢) 。所以,IIS就去它的 擴(kuò)展程序映射表 中根據(jù)被請(qǐng)求文件后綴名 查看是否有能夠處理這種文件的擴(kuò)展程序。
而我們ASPNET中常用的文件.aspx/.ashx等 對(duì)應(yīng)的處理程序是aspnet_isapi.dll。如下圖:
????????????? (6)如果IIS根據(jù)后綴名找到對(duì)應(yīng)的處理程序,則通過(guò)調(diào)用此程序來(lái)處理瀏覽器發(fā)送來(lái)的請(qǐng)求報(bào)文。
至于,之后又進(jìn)行了什么操作,請(qǐng)繼續(xù)關(guān)注:
《ASP.NET運(yùn)行機(jī)制原理02_ASP.NET整體運(yùn)行機(jī)制01從瀏覽器到HttpApplication ---沒(méi)有控件的ASP.NET》
轉(zhuǎn)載請(qǐng)注明出處:ASP.NET運(yùn)行機(jī)制原理01---瀏覽器與IIS的交互過(guò)程 開(kāi)智網(wǎng) http://www.oumind.com
?
?
?
ASP.NET頁(yè)面運(yùn)行機(jī)制以及請(qǐng)求處理流程
?
IIS自身是不能處理像ASPX擴(kuò) 展名這樣的頁(yè)面,只能直接請(qǐng)求像HTML這樣的靜態(tài)文件,之所以能處理ASPX這樣擴(kuò)展名的頁(yè)面,是因?yàn)镮IS有一個(gè)ISAPI過(guò)濾器,它是一個(gè)COM組 件。ASP.NET服務(wù)在注冊(cè)到IIS的時(shí)候,就會(huì)添加一個(gè)Win32的擴(kuò)展動(dòng)態(tài)庫(kù)aspnet_isapi.dll。并將擴(kuò)展可以處理的頁(yè)面擴(kuò)展名(如 ASPX)注冊(cè)到IIS里面。擴(kuò)展啟動(dòng)后,就根據(jù)定義好的方式來(lái)處理IIS所不能處理的頁(yè)面。
當(dāng)客戶端請(qǐng)求一個(gè)服務(wù)器資源時(shí),這個(gè) HTTP請(qǐng)求會(huì)被inetinfo.exe進(jìn)程截獲(www服務(wù)),然后Check請(qǐng)求資源的類(lèi)型,并依據(jù)資源映射信息(存儲(chǔ)在IIS元庫(kù)中,一種IIS 專(zhuān)用的配置數(shù)據(jù)庫(kù))將請(qǐng)求的資源分配給特定的處理程序模塊。若請(qǐng)求的是靜態(tài)資源(img,text,html等)則由IIS處理(IIS在本地Web Server上訪問(wèn)請(qǐng)求的文件),將內(nèi)容輸出到控制臺(tái),發(fā)出請(qǐng)求的瀏覽器就能接收到它了。若需要在服務(wù)器端處理的請(qǐng)求,則會(huì)被傳到已注冊(cè)的擴(kuò)展模塊 中,aspx請(qǐng)求會(huì)被分配給aspnet_isapi.dll,讓這個(gè)程序開(kāi)始處理代碼,生成標(biāo)準(zhǔn)的HTML代碼,然后將這些HTML加入到原有的 HTML中,最后把完整的HTML返回給IIS,IIS再把內(nèi)容發(fā)送到客戶瀏覽器。
ASP.NET FrameWork對(duì)請(qǐng)求的處理:
上面說(shuō)到IIS將像ASPX這樣的頁(yè)面分配給aspnet_isapi.dll,接著處理如下:
1、aspnet_isapi.dll則會(huì) 通過(guò)一個(gè)Http PipeLine的管道將這個(gè)Http請(qǐng)求發(fā)給w3wp.exe(iis 工作者進(jìn)程,IIS6.0中叫做 w3wq.exe,IIS5.0中叫做 aspnet_wp.exe),之后asp.net framework就會(huì)通過(guò)HttpRuntime來(lái)處理這個(gè)Http請(qǐng)求。
2、HttpRuntime首先會(huì)確定處理該請(qǐng)求的類(lèi)名,HttpRuntime通過(guò)公共接口IHttpHandler來(lái)調(diào)用該類(lèi)獲取被請(qǐng)求資源的類(lèi)的實(shí)例。
3、調(diào)用HttpRuntime.ProcessRequest開(kāi)始處理要發(fā)送到瀏覽器的頁(yè)面,具體說(shuō)就是創(chuàng)建一個(gè)HttpContext實(shí)例,它封裝了所有與請(qǐng)求有關(guān)的http特有的信息,并初始化一個(gè)Write對(duì)象用于緩存標(biāo)記代碼。
4、HttpRuntime使用上下文信息查找或新建能處理該請(qǐng)求的WEB應(yīng)用程序的對(duì)象。由HttpApplication Factory負(fù)責(zé)返回HttpApplication實(shí)例。
5、HttpApplication實(shí)例會(huì)讀取web.config中所有HttpModule的配置。
5、HttpApplication對(duì)象使用IHttpHandlerFactory類(lèi)型的實(shí)例返回HttpHandler(http處理程序)給HttpRuntime對(duì)象。一個(gè)頁(yè)面只是個(gè)http處理程序?qū)ο蟆?/p>
6、最后由HttpRuntime對(duì)象調(diào)用IHttpHandler的頁(yè)面對(duì)象的ProcessRequest方法。
?
本文轉(zhuǎn)載自? http://www.cnblogs.com/Joans/
?
轉(zhuǎn)載于:https://www.cnblogs.com/feng-c-x/archive/2013/03/07/2947440.html
總結(jié)
以上是生活随笔為你收集整理的asp.net运行机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Entity Framework 6 A
- 下一篇: [转载]acm进阶之路