浅谈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,共同交流进步~

 

posted @ 2012-08-11 20:16  DebugLZQ  阅读(5178)  评论(21编辑  收藏  举报