国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

ASP.NET是如何在IIS下工作的

2019-11-17 01:29:28
字體:
供稿:網(wǎng)友

asp.net是如何在IIS下工作的

ASP.NET與IIS是緊密聯(lián)系的,由于IIS6.0與IIS7.0的工作方式的不同,導(dǎo)致ASP.NET的工作原理也發(fā)生了相應(yīng)的變化。

IIS6(IIS7的經(jīng)典模式)與IIS7的集成模式的不同

IIS6的運行過程:

IIS6運行圖示

分析上圖可知:

在 User Mode 下,http.sys 接收到 http request,然后它會根據(jù) IIS 中的 Metabase 查看基于該 Request 的 application 屬于哪個 Application Pool, 如果該 Application Pool 不存在,則創(chuàng)建之。否則直接將 request 發(fā)到對應(yīng) Application Pool 的 Queue中。每個 Application Pool 對應(yīng)著一個 Worker PRocess — w3wp.exe,(運行在 User Mode 下)。

在 IIS Metabase 中維護著 Application Pool 和 Worker Process 的Mapping。WAS(Web Administrative Service)根據(jù)這樣一個 mapping,將存在于某個 Application Pool Queue 的 request 傳遞到對應(yīng)的 Worker Process (如果沒有,就創(chuàng)建這樣一個進程)。在 Worker Process 初始化的時候,加載 ASP.NET ISAPI,ASP.NET ISAPI 進而加載 CLR。最后通過 AppManagerAppDomainFactory 的 Create 方法為 Application 創(chuàng)建一個 Application Domain;通過 ISAPIRuntime 的 ProcessRequest 處理 Request,進而將流程進入到 ASP.NET Http Runtime Pipeline。

幾個知識點:

  • HTTP.SYS:(Kernel)的一個組件,它負責偵聽(Listen)來自于外部的HTTP請求,根據(jù)請求的URL將其轉(zhuǎn)發(fā)給相應(yīng)的應(yīng)用程序池 (Application Pool)。當此HTTP請求處理完成時,它又負責將處理結(jié)果發(fā)送出去.為了提供更好的性能,HTTP.SYS內(nèi)部建立了一個緩沖區(qū),將最近的HTTP請求處理結(jié)果保存起來。
  • Application Pool: IIS總會保持一個單獨的工作進程:應(yīng)用程序池。所有的處理都發(fā)生在這個進程里,包括ISAPI dll的執(zhí)行。對于IIS6而言,應(yīng)用程序池是一個重大的改進,因為它們允許以更小的粒度控制一個指定進程的執(zhí)行。你可以為每一個虛擬目錄或者整個Web 站點配置應(yīng)用程序池,這可以使你很容易的把每一個應(yīng)用程序隔離到各自的進程里,這樣就可以把它與運行在同一臺機器上其他程序完全隔離。從Web處理的角度看,如果一個進程死掉,至少它不會影響到其它的進程。 當應(yīng)用程序池接收到HTTP請求后,交由在此應(yīng)用程序池中運行的工作者進程Worker Process: w3wp.exe來處理此HTTP請求。
  • Worker Process: 當工作者進程接收到請求后,首先根據(jù)后綴找到并加載對應(yīng)的ISAPI擴展 (如:aspx 對應(yīng)的映射是aspnet_isapi.dll),工作者進程加載完aspnet_isapi.dll后,由aspnet_isapi.dll負責加載 ASP.NET應(yīng)用程序的運行環(huán)境即CLR (.NET Runtime)。 Worker Process運行在非托管環(huán)境,而.NET中的對象則運行在托管環(huán)境之上(CLR),它們之間的橋梁就是ISAPI擴展。
  • WAS(Web Admin Service):這是一個監(jiān)控程序,它一方面可以存取放在InetInfo元數(shù)據(jù)庫(Metabase)中的各種信息,另一方面也負責監(jiān)控應(yīng)用程序池(Application Pool)中的工作者進程的工作狀態(tài)況,必要時它會關(guān)閉一個老的工作者進程并創(chuàng)建一個新的取而代之。

IIS7的運行過程:

IIS7運行圖示

分析上圖可知:

1、當客戶端瀏覽器開始 HTTP 請求一個WEB 服務(wù)器的資源時,HTTP.sys 攔截到這個請求。

2、HTTP.sys 聯(lián)系 WAS 獲取配置信息。

3、WAS 向配置存儲中心(applicationHost.config)請求配置信息。

4、WWW 服務(wù)接收到配置信息,配置信息指類似應(yīng)用程序池配置信息,站點配置信息等等。

5、WWW 服務(wù)使用配置信息去配置 HTTP.sys 處理策略。

6、WAS為請求創(chuàng)建一個進程(如果不存在的話)。

7、工作者進程處理請求并對HTTP.sys做出響應(yīng)。

8、客戶端接受到處理結(jié)果信息。

除了IIS的整體運行方式不同之外,IIS7相比IIS6最大的不同之處在于它提供了兩種應(yīng)用程序池管道模式:

經(jīng)典模式:是與IIS 6或者之前版本保持兼容的一種模式,一個典型問題就是,在處理ASP.NET這種動態(tài)網(wǎng)站的時候,它是通過一個所謂的ISAPI程序,作為插件的方式來工作的。針對不同的動態(tài)應(yīng)用程序(例如ASP,php等),會需要不同的ISAPI(Internet Server Application Programe Interface,互聯(lián)網(wǎng)服務(wù)器應(yīng)用程序接口)。如圖,在IIS中,打開“處理程序映射”,可以看到aspx類型頁面的處理程序為aspnet_isapi.dll。

經(jīng)典模式處理程序映射

下圖展示了IIS7經(jīng)典模式與IIS6的應(yīng)用程序池管道模式運行原理,針對不同的請求,會指定不同的ISAPI(dll)進行處理:

經(jīng)典模式運行圖

集成模式:asp.net不再像IIS6一樣只限定于aspnet_isapi.dll中,而是被解放出來,從IIS接收到HTTP請求開始,即進入asp.net的控制范圍,asp.net可以存在于一個請求在IIS中各個處理階段。允許我們將ASP.NET更好地與IIS集成,甚至允許我們在ASP.NET中編寫一些功能(例如Module)來改變IIS的行為(擴 展)。集成的好處是,不再通過ISAPI的方式,提高了速度和穩(wěn)定性。至于擴展,則可以使得我們對于IIS,以及其他類型的請求有更多的控制。(例如,我 們希望靜態(tài)網(wǎng)頁也具備一些特殊的行為)。如圖

集成模式運行圖

如下圖在IIS7集成模式中,打開處理程序映射,可以看到aspx類型頁面所對應(yīng)的不再是一個dll,而是一個類型。

集成模式處理程序映射

總結(jié)與擴展:

對于處理ASP.NET應(yīng)用程序而言,IIS6及IIS7的經(jīng)典模式需要aspnet_isapi.dll來處理,而IIS7集成模式不需要aspnet_isapi.dll來處理,而可以直接根據(jù)文件擴展名找到相應(yīng)的處理程序接口。例如aspx的處理程序是System.Web.UI.PageHandlerFactory類型。

介紹完IIS的工作原理,來看一下ASP.NET內(nèi)部的運行機制。

首先看一下IIS處理模型:

image

上面介紹IIS工作原理時,已經(jīng)介紹了從發(fā)起HTTP請求,到響應(yīng)請求的過程,這里主要介紹當請求到達.NET Runtime之后,.NET運行時所發(fā)生的一系列工作。

先看如下的.NET運行時工作序列圖:

.net運行時序列圖

1.HTTP請求進入Web服務(wù)器后,首先由HTTP.SYS來判斷請求的頁面是否存在,如果存在的話將把請求信息轉(zhuǎn)交給.NET Runtime。在這部分實際是完成兩個步驟,在將請求轉(zhuǎn)交給.NET Runtime的同時將請求信息封存在HTTPWorkRequest類中供其它步驟調(diào)用。HttpWorkRequest類在以后的操作中至關(guān)重要,它第一次將Http請求信息轉(zhuǎn)換為類信息。 2.當請求到達.NET Runtime后,接下來的操作將會在托管環(huán)境中完成,這時請求就真正進入了.NET中,對請求信息的操作是由.NET的底層類庫來實現(xiàn)。首先.NET Runtime將會針對請求信息做兩個動作,一是準備HostingEnvironment;二是調(diào)用ApplicationManager類為HTTP請求動態(tài)的分配AppDomain,并把處理權(quán)交給AppDomain。 3.HTTP請求進入AppDomain后,將由對象ISAPIRuntime來接管,一方面經(jīng)方法ProcessRequest()得到HttpWorkerRequest對象,另一方面由方法StartProcessing()生成HttpRuntime對象,接下來把處理權(quán)交給了HttpRuntime(HttpWorkerRequest對象將作為HttpRuntime方法中的參數(shù)被使用)。 4.HTTPRuntime接收到Http請求后,方法ProcessRequest處理請求。將對第1步中的HTTPWorkRequest類中的信息進行操作,具體的實現(xiàn)由ProcessRequest方法實現(xiàn)。內(nèi)部代碼如下:

[AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Medium)]public static void ProcessRequest(HttpWorkerRequest wr){    if (wr == null)    {        throw new ArgumentNullException("wr");    }    if (UseIntegratedPipeline)    {        throw new PlatformNotSupportedException(System.Web.SR.GetString("Method_Not_Supported_By_Iis_Integrated_Mode", new object[] { "HttpRuntime.ProcessRequest" }));    }    ProcessRequestNoDemand(wr);}internal static void ProcessRequestNoDemand(HttpWorkerRequest wr){    RequestQueue queue = _theRuntime._requestQueue;    if (queue != null)    {        wr = queue.GetRequestToExecute(wr);    }    if (wr != null)    {        CalculateWaitTimeAndUpdatePerfCounter(wr);        wr.ResetStartTime();        ProcessRequestNow(wr);    }}internal static void ProcessRequestNow(HttpWorkerRequest wr){    _theRuntime.ProcessRequestInternal(wr);}

5.在HttpRunTime中經(jīng)過一系列的驅(qū)動后,將會在ProcessRequestInternal方法中為Http請求分配應(yīng)用程序。在這一步中還將創(chuàng)建HttpContext對象。

context = new HttpContext(wr, false); // 基于HttpWorkerRequest生成HttpContextIHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context); // 得到HttpApplicationhandler2.BeginProcessRequest(context, this._handlerCompletionCallback, context); // 由HttpApplication處理請求

6.經(jīng)過步驟5后HTTP請求信息才由基本信息轉(zhuǎn)交給了Asp.net中的各個對象。接下來的操作會觸發(fā)一些列的管道事件,這時的請求才真正轉(zhuǎn)到HttpModule和HttpHandler中。 接下來我們看看常說的管道事件的創(chuàng)建過程:

internal override void BuildSteps(WaitCallback stepCallback){    ArrayList steps = new ArrayList();    HttpApplication app = base._application;    bool flag = false;    UrlMappingsSection urlMappings = RuntimeConfig.GetConfig().UrlMappings;    flag = urlMappings.IsEnabled && (urlMappings.UrlMappings.Count > 0);    steps.Add(new HttpApplication.ValidatePathExecutionStep(app));    if (flag)    {        steps.Add(new HttpApplication.UrlMappingsExecutionStep(app));    }    app.CreateEventExecutionSteps(H
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 青冈县| 武川县| 金门县| 沾化县| 宣化县| 台中县| 施秉县| 务川| 资中县| 德令哈市| 肃北| 乐安县| 石泉县| 博野县| 九寨沟县| 四川省| 泰安市| 开化县| 潜江市| 沅江市| 庐江县| 沿河| 长顺县| 兴山县| 沽源县| 宜丰县| 新蔡县| 甘孜县| 新邵县| 密云县| 宁武县| 兖州市| 龙里县| 兴宁市| 桂平市| 建阳市| 常宁市| 离岛区| 浦东新区| 星座| 嘉善县|