文章目錄
- 1.NET 宿主
- 2.ISAPI過濾器
- 3.ASP.NET本質是什麼[ASP.NET運行機制]
- 4.結束語
ASP.NET是微軟公司提供的編寫動態網站的技術架構,其特點是基於.NET架構基礎,所有的ASP.NET程式都可以使用針對.NET的語言編寫。在微軟的VS開發平台中,實現了拖放控制項等便捷的功能,使得ASP.NET應用程式的開發效率得到了較大的提高,今年來ASP.NET逐漸成為網站開發的主流技術之一。
但是ASP.NET的本質到底是什麼?為了回答這個問題,下面先介紹2個概念。
1.NET 宿主
作為一個致力於運行在Windows作業系統之上的技術架構,.NET的實現充分體現了這一點。.NET小組實質上把CLR實現為一個標準的COM伺服器組件,CLR具有標準的COM介面和介面GUID,在安裝.NET時,CLR作為一個COM伺服器將在作業系統內被註冊。使用VS內建的OleView工具可以查看到作業系統上登入的COM組件,顯示了DebugLZQ筆記本上註冊的CLR。
註冊成COM伺服器的CLR
可從路徑找到這個工具。
作為標準的COM伺服器,CLR實質上是可以被用戶端載入使用的,也就是說,在非託管的代碼上,可以通過載入一個COM伺服器的方法來載入一個CLR,從而在這個CLR中載入程式集、模組,進而運行Managed 程式碼。
下面給出一個簡單的載入CLR的樣本。
簡單的託管Assembly代碼如下:
using System;namespace NET.MST.Eighth.SimpleAssembly{ /// <summary> /// 一個簡單的程式集,輸出傳入的字串 /// </summary> public class SimpleAssembly { static int WriteString(String s) { Console.WriteLine("CLR Host Output:" + s); return 1; } }}
在Unmanaged 程式碼中載入CLR運行Managed 程式碼,代碼如下:
// LoadCLR.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <windows.h>//這裡定義載入哪個版本的CLR#include <MSCorEE.h> #pragma comment(lib,"MSCorEE.lib")//載入CLR,從而運行Managed 程式碼void main(int argc, _TCHAR* argv[]){ ICLRRuntimeHost *pHost; HRESULT hr=CorBindToRuntimeEx( NULL, NULL, 0, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (PVOID*)&pHost); pHost->Start(); ICLRControl* clrControl = NULL; hr = pHost->GetCLRControl(&clrControl); DWORD* returnvalue=NULL; //開始運行Managed 程式碼 pHost->ExecuteInDefaultAppDomain( L"..\\..\\..\\SimpleAssembly\\bin\\Debug\\SimpleAssembly.dll", L"NET.MST.Eighth.SimpleAssembly.SimpleAssembly", L"WriteString", L"http://www.cnblogs.com/DebugLZQ", returnvalue); system("pause"); //結束時卸載CLR}
程式運行結果如下:
正如上面代碼所示,在Unmanaged 程式碼中使用CLR COM服務是意見非常容易的事情,在代碼結束時COM將被卸載。當然真是系統中可能需要更多的代碼來保證載入和卸載有效完成。
分析到此,可能會有些疑惑,.NET宿主的概念和ASP.NET是什麼關係呢?事實上,ASP.NET就是一個CLR的宿主,也就是說,ASP.NET的工作代碼類似於上面的代碼:載入CLR並且運行託管的網站伺服器代碼,也就是為什麼ASP.NET是基於.NET架構的原因。
2.ISAPI過濾器
在詳細描述ASP.NET作為CLR宿主的細節行為前,需要先解釋ISAPI的概念。ISAPI的全稱是Internet伺服器擴充應用程式,而ISAPI過濾器則是指在啟動ISAPI的HTTP伺服器上啟動並執行一個DLL,他可以用來處理特定的HTTP請求,例如綁定所有htm檔案到某個ISAPI過濾器,就會導致所有對htm檔案的請求都經由這個ISAPI過濾器來處理。
ASP.NET就是一個ISAPI過濾器,在通暢情況下所有對於aspx、ascx、asmx、asp等ASP.NET伺服器網頁檔案的請求都會被綁定到ASP.NET,由其來載入CLR並運行Managed 程式碼來進行處理。
上個圖來說明吧,圖從百度上弄來的,說明下問題,有圖有真相。
顯示了在安裝ASP.NET之後IIS中的ISAPI列表,可以清楚的看到ASP.NET是作為一個ISAPI過濾器來啟動並執行。
3.ASP.NET本質是什麼[ASP.NET運行機制]
在解釋了ASP.NET的兩大特性之後,基本可以完整的回答什麼是ASP.NET了。
ASP.NET是一個宿主CLR的ISAPI過濾程式。
從ISAPI到ASP.NET再到Managed 程式碼的底層運行機制十分複雜,這裡DebugLZQ只做一個簡單的介紹:
- ASP.NET初始運行,載入CLR。
- IIS接受到一個HTTP請求,並且判斷出這個請求應該被綁定到ASPNET_Filter.dll這個ISAPI過濾器。
- ASP.NET開始處理這個HTTP請求,判斷該請求所屬的網站,如果是該網站的第一個請求,則建立一個應用程式定義域來處理這個請求,如果之前已經有對該網站的請求,這使用現有的應用程式定義域來處理請求。
- 當某個網站的檔案被動態更新(ASP.NET 2.0以後,1.0網站的更新需要編譯新的DLL)將重新載入屬於該網站的應用程式定義域。
4.結束語 本文所屬為DebugLZQ,轉載請註明出處。 如果您覺得這篇博文對您有協助,請推薦之並關注DebugLZQ,共同交流進步~