一、Asp.net 運行機制概述
1.使用Asp.net 進行動態Web開發,編寫好Web應用程序,即動態頁面,並部署到Web服務器,如IIS中;
2.客戶端在瀏覽器輸入地址,請求相應的動態頁面;
3.Web 服務器根據客戶端的請求,對Web應用程序進行編譯或解釋,並生成HTML流,返回給客戶端
4.客戶端瀏覽器解釋HTML流,並顯示為Web頁面
二、Asp.net 運行機制詳解
圖1.1 ASP.NET 處理請求的內部過程
1.當請求發送到服務器IIS並被其接受后,IIS服務器會判斷請求文件的類型:
1)、如果是靜態文件,如html、jpg、gif和txt等,IIS會根據目錄找到文件發送給客戶端;
2)、如果是動態文件,如aspx頁面,則IIS會通過aspnet_isapi.dll將請求轉交給ASP.NET運行時環境,最終的處理結果會返回給IIS,然后發送到客戶端。
2.ASP.NET運行時環境
在Asp.net運行時環境中處理請求是通過一系列對象來完成的,包括HttpApplication、HttpModule和HttpHandler
1).HttpApplication:處理收到的請求,HttpApplication對象每次只能處理一個請求,這樣其成員變量才可用於存儲針對每個請求的數據,如Request對象和Response對象;
2).HttpModule:負責所有請求的初始化和請求收尾工作,即它可以在一次HTTP請求傳遞到最終的“請求處理中心”(HttpHandler)進行處理之前做一些額外工作,或者在某些情況下
終止滿足一些條件的HTTP請求,從而起到一個過濾的作用;
HttpModule應用實例:
①添加一個類,實現IHttpModule接口,並實現該接口中的Dispose()方法和Init()方法
public class TestHttpModule:IHttpModule
{
public TestHttpModule()
{
//
// TODO: Add constructor logic here
//
}
//Dispose執行釋放資源的工作
public void Dispose()
{
throw new NotImplementedException();
}
//Init執行初始化的工作
public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
context.EndRequest += context_EndRequest;
}
private void context_EndRequest(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
application.Response.Write("<p>開始處理請求!</p>");
}
private void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
application.Response.Write("<p>結束處理請求!</p>");
}
}
②在Web.config中的<configuration>節點下添加如下內容
<system.webServer>
<modules>
<add name="test" type="TestHttpModule" /> //name自己任意賦值,type類型等於自己實現IHttpModule接口的class名稱
</modules>
</system.webServer>
3).HttpHandler:HTTP請求的最終處理中心,負責所有請求的具體工作(請求由該對象的ProcessRequest方法處理,如圖1.2) ;
圖1.2 HttpHandler對象的ProcessRequest方法處理請求
示例:
①添加一個類,實現IHttpHandler接口,並實現接口內的IsRequest屬性和ProcessRequest()方法:(這里創建Handler類不是使用的“一般處理程序”,而是手動添加類創建Handler類)
ProcessRequest()方法的參數HttpContext 表示當前請求的上下文,通過它的屬性可以直接訪問Application、Request、Server和Session
②在Web.config中configuration節點下添加如下內容: