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

  • 相关阅读:
    【边框回归】边框回归(Bounding Box Regression)详解(转)
    【ROI Pooling】ROI Pooling层详解(转)
    【课程笔记】优秀课程笔记整理
    【TensorFlow/简单网络】MNIST数据集-softmax、全连接神经网络,卷积神经网络模型
    jQuery中ajax请求的六种方法(三、三):$.post()方法
    jQuery中ajax请求的六种方法(三、二):$.get()方法
    jQuery中ajax请求的六种方法(三、一):$.ajax()方法
    jQuery中的常用方法:empty()、each()、$.each()、$.trim()、focus()(二)
    jQuery中获取属性值:attr()、html()、text()、val()等(一)
    简陋的Excel到MYSQL的数据传输JAVA实现
  • 原文地址:https://www.cnblogs.com/DebugLZQ/p/2630984.html
Copyright © 2020-2023  润新知