淺談ASP.NET的本質【ASP.NET到底是什嗎?】

來源:互聯網
上載者:User
文章目錄
  • 1.NET 宿主
  • 2.ISAPI過濾器
  • 3.ASP.NET本質是什麼[ASP.NET運行機制]
  • 4.結束語

  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中載入程式集、模組,進而運行Managed 程式碼。

  下面給出一個簡單的載入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;        }    }}

在Unmanaged 程式碼中載入CLR運行Managed 程式碼,代碼如下:

// 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,從而運行Managed 程式碼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;    //開始運行Managed 程式碼    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}

程式運行結果如下:

   正如上面代碼所示,在Unmanaged 程式碼中使用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並運行Managed 程式碼來進行處理。

  上個圖來說明吧,圖從百度上弄來的,說明下問題,有圖有真相。

  顯示了在安裝ASP.NET之後IIS中的ISAPI列表,可以清楚的看到ASP.NET是作為一個ISAPI過濾器來啟動並執行。

3.ASP.NET本質是什麼[ASP.NET運行機制]

   在解釋了ASP.NET的兩大特性之後,基本可以完整的回答什麼是ASP.NET了。

  ASP.NET是一個宿主CLR的ISAPI過濾程式。

  從ISAPI到ASP.NET再到Managed 程式碼的底層運行機制十分複雜,這裡DebugLZQ只做一個簡單的介紹:

  • ASP.NET初始運行,載入CLR。
  • IIS接受到一個HTTP請求,並且判斷出這個請求應該被綁定到ASPNET_Filter.dll這個ISAPI過濾器。
  • ASP.NET開始處理這個HTTP請求,判斷該請求所屬的網站,如果是該網站的第一個請求,則建立一個應用程式定義域來處理這個請求,如果之前已經有對該網站的請求,這使用現有的應用程式定義域來處理請求。
  • 當某個網站的檔案被動態更新(ASP.NET 2.0以後,1.0網站的更新需要編譯新的DLL)將重新載入屬於該網站的應用程式定義域。
4.結束語  本文所屬為DebugLZQ,轉載請註明出處。  如果您覺得這篇博文對您有協助,請推薦之並關注DebugLZQ,共同交流進步~

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.