新聞中心
我們分3個部分來討論ASP.NET處理過程。這里我們主要討論WebApplication以上的兩個部分。中間會對比IIS在Asp.net中的角色。

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、山亭網(wǎng)絡(luò)推廣、小程序設(shè)計、山亭網(wǎng)絡(luò)營銷、山亭企業(yè)策劃、山亭品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供山亭建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
了解這些過程之后,我們就可以定義自己的WebServer。WebServer不是只有IIS的,沒了它,asp程序照樣過日子。
這里使用的例子是WebMatrix的WebHost的實現(xiàn)。通過修改這些類,來實現(xiàn)我自己的一個小功能:Host為每個WebApp分配一個ServiceManager的實例。(沒有版權(quán)問題吧?)
第一部分:WebHost
從端口偵聽請求,接受請求,形成HttpWorkerRequest
1:創(chuàng)建socket端口接聽
listener而已。
2:創(chuàng)建WebHost
通過.net提供的ApplicationHost.CreateApplicationHost(typeof(Host), virtualPath, physicalPath)靜態(tài)函數(shù)來創(chuàng)建Asp.net處理的宿主空間。
這個Host繼承自MarshalByRefObject,可以跨程序域調(diào)用。這是關(guān)鍵,因為每個WebApp會被分配一個AppDomain,進行運行。所以Host要可以創(chuàng)建這些AppDomain,并且可以調(diào)用。
3:實現(xiàn)抽象類HttpWorkerRequest
.net提供了一個SimpleWorkerRequest的實現(xiàn)。簡單的可以直接調(diào)用它。復(fù)雜一點的話,需要自己重寫更多的方法。
這個類就是封裝了所有向下傳遞的屬性和數(shù)據(jù)。
這時WebHost和具體的每個WebApp的唯一連接點。
第二部分:處理HttpWorkerRequest
根據(jù)HttpWorkerRequest,實例化出HttpContext和IHttpHandler。這部分好像就進了.net內(nèi)部的幾個類了。不知道能不能在控制。
1:HttpRuntime的第一次處理
根據(jù)HttpWorkerRequest 創(chuàng)建context,根據(jù)contxt創(chuàng)建IHttpHandler實例,hanlder根據(jù)這個context開始運行。然后就到了網(wǎng)頁處理了。
通過調(diào)用System.Web.HttpRuntime.ProcessRequest(HttpWorkerRequest wr)靜態(tài)函數(shù)來進入這個處理。
System.Web.HttpRuntime接受到HttpWorkerRequest對象。看看這個函數(shù):
- publicstaticvoidProcessRequest(HttpWorkerRequestwr)
- {
- //忽略其他細(xì)節(jié)
- HttpContextcontext1=newHttpContext(wr,false);
- //根據(jù)HttpWorkerRequest創(chuàng)建context
- IHttpHandlerhandler1=HttpApplicationFactory.GetApplicationInstance(context1);
- //根據(jù)context創(chuàng)建App實例
- handler1.ProcessRequest(context1);//運行實例,參數(shù)是context。
- }
2:HttpContext(HttpWorkerRequest, false)
創(chuàng)建HttpContext,根據(jù)HttpWorkerRequest。
只看這兩句就行。
request=new HttpRequest(wr, this);
response=new HttpResponse(wr, this);
request和response都是依據(jù)wr構(gòu)造的。
3:再看看HttpRequest是如何構(gòu)造的
這是原代碼
- internalHttpRequest(HttpWorkerRequestwr,HttpContextcontext)
- {
- this._contentLength=-1;
- this._wr=wr;
- this._context=context;
- }
第三部分:網(wǎng)頁處理。
既然已經(jīng)產(chǎn)生了IHttpHandler和HttpContext了,剩下的就到了具體的每個WebApp了。
IHttpHandler之后就到了每個頁面了。成了WebApplition。具體的不說了。
這時候的handler就已經(jīng)獲得了HttpContext了。
其中IIS作的,好像就是第一部分的功能,我們自己做一個宿主的話,也主要是完成第一部分。
看看WebMatrix的這幾個類的定義
1:WebMatrix.Server
這個類是用來向外提供操作接口的類。繼承自MarshalByRefObject??梢钥缬蛘{(diào)用。
主要操作:CreateHost(根據(jù)端口號,虛擬目錄,物理根目錄等信息創(chuàng)建WebHost),StopWebServer(停止服務(wù)),StartWebServer(啟動服務(wù))等
關(guān)鍵代碼:host=ApplicationHost.CreateApplicationHost(typeof(Host), this._virtualPath, this._physicalPath);者是用來創(chuàng)建Host的代碼。
2:WebMatrix.Host
這是為每個WebApp創(chuàng)建處理進程空間的宿主類。繼承自MarshalByRefObject
主要操作:
OnSocketAccept{new connection;connection.ProcessOneRequest(host,this);}
在接受到socket之后,調(diào)用處理請求
3:WebMatrix.Connection
連接處理
主要部分:調(diào)用Request
- rocessOneRequest()
- {
- Requestrequest1=newRequest(this._host,this,this._serviceManager);
- request1.Process();
- }
4:WebMatrix.Request
重點。繼承自SimpleWorkerRequest。SimpleWorkerRequest繼承自HttpWorkerRequest。而HttpWorkerRequest就是宿主和WebApp唯一的連接點,是WebApp唯一的入口參數(shù)。
這個類主要重寫Process方法,通過調(diào)用HttpRuntime.ProcessRequest(this)這句代碼來進行WebApp的處理。
好了,現(xiàn)在來完成我自己的一個小功能
1:先獲取Matrix的WebServer的源代碼。通過Reflector工具。
2:修改Request類,就是那個繼承自SimpleWorkerRequest的那個類,加一個屬性:ServiceManager
3:修改Host和Server,使之可以向Request傳遞ServiceManager。
4:使用:在每個WebApp里可以這樣使用
IServiceProvider p=(IServiceProvider)HttpContext.Current;
Request wr=(Request)p.GetService(typeof(HttpWorkerRequest));
object o=wr.ServiceManager;
比如這是在一個網(wǎng)頁的page_load里面。
注意事項
1:物理根目錄
就像wwwroot一樣,使整個site的根目錄。比如c:\maxsoft.site
2:虛擬目錄
相對于根目錄之后的位置。比如c:\maxsoft.site\myTest的虛擬目錄就是/myTest
3:端口號
隨意制定,只要不和系統(tǒng)的沖突就可以。比如6066
4:訪問方式
目標(biāo)機器:端口號/虛擬目錄/文件名。比如http://maxpc2/myTest/webform1.aspx
5:安裝
一定要在物理根目錄的bin文件夾里面放有本W(wǎng)ebServer程序。比如要把“Maxplatform.UI.Web.WebHost.dll”拷貝到c:\maxsoft.site\bin\目錄下。這個文件是編譯有WebHost類的那個程序集。以上介紹ASP.NET處理過程。
【編輯推薦】
- ASP.NET頁面顯示XML數(shù)據(jù)
- 了解什么是IFRAME ASP.NET
- ASP.NET生命周期的展示
- 解決ASP.NET AJAX腳本的錯誤問題
- 詳解ASP.NET應(yīng)用程序
分享標(biāo)題:三個方面詳細(xì)討論ASP.NET處理
文章路徑:http://m.fisionsoft.com.cn/article/cdhejse.html


咨詢
建站咨詢
