廣州暨華電腦學校
咨詢熱線:020-85566216

誠        毅        精      勤

當前位置:所在位置: 廣州電腦培訓 >> 電腦技術 >> net >> 正文

ASP.NET運行機制

發布時間:2018/2/26 14:00:23 內容來源::廣州暨華電腦學校 點擊:

  我們從web程序的入口開始。那就要先說到iis了,大家都知道,這是web服務軟件。將web程序部署到iis過的人都知道,如果不做任何處理,我們寫的webform是不能運行的。為什么非要執行aspnet_regiis才可以呢?我們看一下電腦路徑C:\Windows\Microsoft.NET\Framework\v4.0.30319,aspnet_regiis.exe就在這里路徑下。我們簡單說一下原因,看下iis的歷史,在百度上沒有查到iis軟件發布的年限,但至少iis在windows 2000的時候就存在了,而我們的.net framework在2002-02-13的時候才發布1.0版本,是啊,我們都知道微軟很厲害,但就是在厲害他也不會強大到可以預測幾年后的軟件運行機制吧。也就是說iis對.net framework還說就是個“古董”,他不可能會知道.net framewrok運行機制,更不可能知道asp.net的運行機制。早起的iis也只能處理靜態頁面,也就類似于html,js,圖片之類的東西。但現在如果我們想將asp.net 程序部署到iis上怎么辦呢?對,擴展,使用擴展程序,我們運行aspnet_regiis.exe也就是將擴展程序(aspnet_isapi)注入到iis中,這樣iis就可以處理了?---------哈哈,iis還是處理處理不了asp.net程序,但是后注入的程序可以告訴iis,我擴展程序可以處理什么樣的程序,你如果處理不了,可以嘗試交給我處理。

  看一下上面說到的路經下面有個aspnet_isapi.dll,我們只是簡單的說一下這里,這個dll是使用c/c++寫的,并不是c#寫的,所以我們無法反編譯成c#代碼。這是個承上啟下的動態庫,因為c/c++并不是我們考慮的范圍內,我們直接認為這個程序將請求交給我們“在乎”的程序,下面我們開始反編譯我們“在乎”程序。反編譯工具中查找ISAPIRuntime這個類,下面是我反編譯出來的結果這個類是system.web程序集下的類

  View Code

  其實我貼出代碼沒有別的意思,就是想用事實說話,過多的內容我們不看,我們只看里面的public int ProcessRequest(IntPtr ecb, int iWRType)處理請求方法。我們先看一下參數類型吧,IntPtr?有調c/c++動態庫的人會知道這是c/c++里面指針類型,我們不用過多的考慮。我自己分析的,不知道對不對,正因為這是IntPtr,所以該類應該是調用了c/c++相關的動態庫了,不然這里也沒有必要用到。這樣流程就出來了,IIS——》aspnet_isapi(c/c++相關動態庫)——》ISAPIRuntime類;需要提到一點的是,IntPtr是個指針,指針會指向一塊內存區域,可能很大,也可能很小。我認為請求的內容放在了這塊區域中,從這里面可以獲取到瀏覽器請求頭的內容下面是ProcessRequest方法的內容

  View Code

  下面我們來分析一下這里面的代碼,我們只分析重要的部分。

  這里新建了一個 ISAPIWorkerRequest wr = null;類,進行創建封裝該對象,wr = ISAPIWorkerRequest.CreateWorkerRequest(ecb, useOOP);上面說了ecb是個指針,里面可以存儲很多請求內容的。緊接著對wr進行初始化wr.Initialize();我們著重看HttpRuntime.ProcessRequestNoDemand(wr);注意這里使用的是HttpRuntime,一會我們還會分析該類,現在我們進入ProcessRequestNoDemand方法里面看看。這里面應該是關于多線程模型了

  View Code

  這時ISAPIRuntime已經將請求交給HttpRuntime類了,HttpRuntime類調用RequestQueue queue = _theRuntime._requestQueue;該類試圖獲取請求處理隊列,我們可以簡單的認為服務器在求情一個線程來處理該次瀏覽器的請求。wr = queue.GetRequestToExecute(wr);我們進入到GetRequestToExecute方法,

  View Code

  當然服務器不可能只有一個求情,如果同時有多個用戶請求,這時隊列中就可能沒有線程可響應此次請求,在這里面就會調用this.ScheduleMoreWorkIfNeeded();從線程池中拿出一個來處理請求。下面我們返回ProcessRequestNoDemand()方法,該方法調用了ProcessRequestNow(wr);處理請求。

  View Code

  我們只看ProcessRequestNow()方法

  這個方法又調用了HttpRuntime的ProcessRequestInternal方法,接下來我們開始分析HttpRuntme類,

  View Code

  看ProcessRequestInternal()方法

  View Code

  在這里創建了上下文 HttpContext context;對象,使用wr(wr中封裝了請求信息)對象創建了上下文對象 context = new HttpContext(wr, false);

  IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);使用HttpApplicationFactory創建HttpApplication對象,applicationInstance.ProcessRequest(context);在這個方法中會調用近20幾個是事件,該對象在后面的事件中通過反射創建請求頁面類的對象在第7個事件和第8個事件中間通過反射創建前臺頁面類對象,后續的事件之間又調用頁面類對象的ProcessRequest方法,這就是我們寫的asp.net程序后臺類為什么有ProcessRequest方法了,我們應該知道前臺頁面類繼承后臺頁面類,我在這里再貼一下HttpApplication類的代碼

  View Code

  感興趣的可以看一下這里面的屬性,事件(事件執行順序并不是寫的那個順序);下面我畫張圖,簡單描述一下過程

  剩下就是頁面類執行ProcessRequest的方法了,今天先不說了,太晚了。接下來我們繼續mvc也可以了,我們mvc并沒有頁面類的ProcessRequest方法,以后有時間在說這里吧。

  • 上一篇電腦技術:
  • 下一篇電腦技術:
  • 學校簡介 |專業課程 | 學生就業 | 參觀學校

    學校地址:廣州天河區五山路金華園區C座3樓307(華南理工大學南門旁)

    學校名稱:廣州暨華電腦培訓學校 聯系電話:020-85566215

    2002-2019 廣州青大教育信息咨詢有限公司 版權所有 備案/許可證編號為:粵ICP備11083420號-11

    今天30选5开奖公告