我們分個部分來討的處理過程這裡我們主要討論WebApplication以上的兩個部分中間會對比IIS在中的角色
了解這些過程之後我們就可以定義自己的WebServerWebServer不是只有IIS的沒了它asp程序照樣過日子
這裡使用的例子是WebMatrix的WebHost的實現通過修改這些類來實現我自己的一個小功能Host為每個WebApp分配一個ServiceManager的實例(沒有版權問題吧?)
開始吧
第一部分WebHost
從端口偵聽請求接受請求形成HttpWorkerRequest
創建socket端口接聽
listener而已
創建WebHost
通提供的ApplicationHostCreateApplicationHost(typeof(Host) virtualPath physicalPath)靜態函數來創建處理的宿主空間
這個Host繼承自MarshalByRefObject可以跨程序域調用這是關鍵因為每個WebApp會被分配一個AppDomain進行運行所以Host要可以創建這些AppDomain並且可以調用
實現抽象類HttpWorkerRequest
提供了一個SimpleWorkerRequest的實現簡單的可以直接調用它復雜一點的話需要自己重寫更多的方法
這個類就是封裝了所有向下傳遞的屬性和數據
這時WebHost和具體的每個WebApp的唯一連接點
第二部分處理HttpWorkerRequest
根據HttpWorkerRequest實例化出HttpContext和IHttpHandler 這部分好像就進內部的幾個類了不知道能不能在控制
HttpRuntime的第一次處理
根據HttpWorkerRequest 創建context根據contxt創建IHttpHandler實例hanlder根據這個context開始運行然後就到了網頁處理了
通過調用SystemWebHttpRuntimeProcessRequest(HttpWorkerRequest wr)靜態函數來進入這個處理
SystemWebHttpRuntime接受到HttpWorkerRequest對象看看這個函數
public static void ProcessRequest(HttpWorkerRequest wr)
{
//忽略其他細節
HttpContext context = new HttpContext(wr false);//根據HttpWorkerRequest創建context可以看出HttpWorkerRequest是contxt的基礎
IHttpHandler handler = HttpApplicationFactoryGetApplicationInstance(context);//根據context創建App實例
handlerProcessRequest(context);//運行實例參數是context
}
HttpContext(HttpWorkerRequest false)
創建HttpContext根據HttpWorkerRequest
只看這兩句就行
request=new HttpRequest(wr this)
response=new HttpResponse(wr this);
request和response都是依據wr構造的
再看看HttpRequest是如何構造的
這是原代碼
internal HttpRequest(HttpWorkerRequest wr HttpContext context)
{
this_contentLength = ;
this_wr = wr;
this_context = context;
}
第三部分網頁處理既然已經產生了IHttpHandler和HttpContext了剩下的就到了具體的每個WebApp了
IHttpHandler之後就到了每個頁面了成了WebApplition具體的不說了
這時候的handler就已經獲得了HttpContext了
其中IIS作的好像就是第一部分的功能我們自己做一個宿主的話也主要是完成第一部分
看看WebMatrix的這幾個類的定義
WebMatrixServer
這個類是用來向外提供操作接口的類繼承自MarshalByRefObject可以跨域調用
主要操作CreateHost(根據端口號虛擬目錄物理根目錄等信息創建WebHost)StopWebServer(停止服務)StartWebServer(啟動服務)等
關鍵代碼host=ApplicationHostCreateApplicationHost(typeof(Host) this_virtualPath this_physicalPath);者是用來創建Host的代碼
WebMatrixHost
這是為每個WebApp創建處理進程空間的宿主類繼承自MarshalByRefObject
主要操作
OnSocketAccept{new connectionconnectionProcessOneRequest(hostthis)}
在接受到socket之後調用處理請求
WebMatrixConnection
連接處理
主要部分調用Request
rocessOneRequest()
{
Request request = new Request(this_hostthisthis_serviceManager);
requestProcess();
}
WebMatrixRequest
重點繼承自SimpleWorkerRequestSimpleWorkerRequest繼承自HttpWorkerRequest而HttpWorkerRequest就是宿主和WebApp唯一的連接點是WebApp唯一的入口參數
這個類主要重寫Process方法通過調用HttpRuntimeProcessRequest(this)這句代碼來進行WebApp的處理
好了現在來完成我自己的一個小功能
先獲取Matrix的WebServer的源代碼通過Reflector工具
修改Request類就是那個繼承自SimpleWorkerRequest的那個類加一個屬性ServiceManager
修改Host和Server使之可以向Request傳遞ServiceManager
使用在每個WebApp裡可以這樣使用
IServiceProvider p=(IServiceProvider)HttpContextCurrent;
Request wr=(Request)pGetService(typeof(HttpWorkerRequest));
object o=wrServiceManager;
比如這是在一個網頁的page_load裡面
注意事項
:物理根目錄
就像wwwroot一樣使整個site的根目錄比如c:\maxsoftsite
虛擬目錄
相對於根目錄之後的位置比如c:\maxsoftsite\myTest的虛擬目錄就是/myTest
端口號
隨意制定只要不和系統的沖突就可以比如
訪問方式
目標機器:端口號/虛擬目錄/文件名比如x
安裝
一定要在物理根目錄的bin文件夾裡面放有本WebServer程序
比如要把MaxplatformUIWebWebHostdll拷貝到c:\maxsoftsite\bin\目錄下
這個文件是編譯有WebHost類的那個程序集
問題WebPart不能顯示
只有在vs自帶的web服務程序上才能顯示好像用IIS也不行
看vs的webserver的代碼它使用了 HostingEnvironmentDispatchRequest(this);函數
難道它不使用HTTPRuntime
From:http://tw.wingwit.com/Article/program/net/201311/12097.html