淺談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,共同交流進步~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM