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中加載程序集、模塊,進而運行托管代碼。
下面給出一個簡單的加載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; } } }
在非托管代碼中加載CLR運行托管代碼,代碼如下:
// 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,從而運行托管代碼 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; //開始運行托管代碼 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 }
程序運行結果如下:
正如上面代碼所示,在非托管代碼中使用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並運行托管代碼來進行處理。
上個圖來說明吧,圖從百度上弄來的,說明下問題,有圖有真相。
上圖顯示了在安裝ASP.NET之后IIS中的ISAPI列表,可以清楚的看到ASP.NET是作為一個ISAPI過濾器來運行的。
3.ASP.NET本質是什么[ASP.NET運行機制]
在解釋了ASP.NET的兩大特性之后,基本可以完整的回答什么是ASP.NET了。
ASP.NET是一個宿主CLR的ISAPI過濾程序。
從ISAPI到ASP.NET再到托管代碼的底層運行機制十分復雜,這里DebugLZQ只做一個簡單的介紹:
- ASP.NET初始運行,加載CLR。
- IIS接受到一個HTTP請求,並且判斷出這個請求應該被綁定到ASPNET_Filter.dll這個ISAPI過濾器。
- ASP.NET開始處理這個HTTP請求,判斷該請求所屬的網站,如果是該網站的第一個請求,則新建一個應用程序域來處理這個請求,如果之前已經有對該網站的請求,這使用現有的應用程序域來處理請求。
- 當某個網站的文件被動態更新(ASP.NET 2.0以后,1.0網站的更新需要編譯新的DLL)將重新加載屬於該網站的應用程序域。
4.結束語
本文所屬為DebugLZQ,轉載請注明出處。
如果您覺得這篇博文對您有幫助,請推薦之並關注DebugLZQ,共同交流進步~