浅谈ASP.NET的本质【ASP.NET到底是什么?】
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,共同交流进步~