ASP.NET(一)--一般處理程序和WebForm


 

ASP.NET(一)--一般處理程序和WebForm

  轉載

一、靜態頁面 VS 動態頁面

靜態頁面:在服務器就相當於直接讀取文件字符串然后返回客戶端瀏覽器;(任何時候訪問看到的都是一樣的界面。)

動態頁面:在服務器是先交給某語言環境虛擬機編譯運行,按照語法生成代碼返回客戶端瀏覽器。(不同條件和時候訪問看到的都界面也不同,因為會在數據庫中按條件讀取不同數據。)

 

二、ASP.Net概述:

1.概念:ASP.Net是一種動態網頁技術,在服務器端運行.Net代碼,動態生成HTML,然后響應給瀏覽器。

2.服務器和客戶端交互的簡述:

    當瀏覽器地址欄寫入一個請求頁面路徑並回車后,瀏覽器會向服務器發送一個請求報文。服務器接收到后,將請求交給指定80端口的軟件IIS。IIS發現是動態頁面,自己處理不了,就去映射表,根據后綴名里找到相應的IIS擴展程序ASPNET_isapi.dll(服務器擴展程序,乃微軟的framework部門按照IIS部門提供的接口開發)來處理。
    在其中,通過HttpRuntime類創建一個 HttpWorkerRequest對象,這個對象保存了指向外部的擴展程序 isapi.dll的指針,通過這個指針能夠讀取請求報文,並可以用它來將生成的響應報文數據轉給IIS並發回給瀏覽器。因為HttpWorkerRequest對象實在太敏感了,所以要將他封裝進一個供程序員使用的HttpContext類。HttpContext類包含:請求報文對象(HttpRequest)、響應報文對象(HttpResponse)、服務器幫助類(Server)、Session等。同時,HttpRuntime類還通過HttpApplicationFactory來創建一個HttpApplication對象,並將HttpContext對象傳給它。
    接下來,大部分處理都是由HttpApplication來完成的!包括調用處理管道(一系列過濾器---本質上就是調用一系列委托)以及創建被請求的頁面類的對象並調用里面的ProcessRequest方法(類似於Main函數,就是這個頁面的入口)。在這里通過訪問context.Request獲得訪問者的請求參數等,然后在ProcessRequest中通過context.Response向瀏覽器發回數據給瀏覽器。 ProcessRequest結束之時就是服務器為這個瀏覽者本次訪問服務完成之時。

 

三、一般處理程序(ashx)

1、ASP.Net:一般處理程序(ashx),WebForm(aspx)、MVC4(Model, View , Controler)

 

2、一般處理程序(HttpHandler): 是一個實現System.Web.IHttpHandler接口的特殊類。任何一個實現了IHttpHandler接口的類,是作為一個外部請求的目標程序的前提。(凡是沒有實現此接口的類,就不能被瀏覽器請求。)它由支持ASP.NET的服務器調用和啟動運行。 一個HttpHandler程序負責處理它所對應的一個或一組URL地址的訪問請求,並接收客戶端發出的訪問請求信息(請求報文)和產生響應內容(響應報文)。

3.HttpHandler程序可以完成普通類程序所能完成的大多數任務:

    A.獲取客戶端通過HTML的Form表單提交的數據和URL參數

    B.創建對客戶端的響應消息內容

    C.訪問服務器端的文件系統

    D.連接數據庫並開發基於數據庫的應用

    E.調用其他類

 

4.分ashx和 ashx.cs 兩個文件,ashx里只有一個指令集,沒有任何其他代碼;ashx.cs就是頁面處理代碼。如果有大量html,需要通過ashx來拼接字符串或讀取模板的方式完成。


5.一般處理程序輸出響應內容,輸出的內容有可能是圖片、html等其他頁面,瀏覽器根據響應報文體內容不知道接收到的是什么,需要判斷響應報文頭里的Content-Type來決定將報文體內容作為何種格式的數據來顯示。

6.一般處理程序內部:
public void ProcessRequest (HttpContext context)

 { 

    context.Response.ContentType = "text/html";
    context.Response.Write("ASP.NET小札(一)--一般處理程序和WebForm");
 }

 public bool IsReusable
        {
            get { return false; }
        }

(1)HttpContext: 請求上下文對象,包含:請求報文對象(HttpRequest),響應報文對象(HttpResponse),服務器幫助類(Server),Session等。

(2)FrameWork在接收到請求后,通過反射技術創建請求路徑對應的類的對象,並強制轉換成IHttpHandler接口對象(HttpHandler實現了IHttpHandler,之后的轉換相當於將子類強轉為父類),統一調用ProcessRequest方法處理。
(3)IsReusable屬性用來表示在IHttpHandlerFactory對象創建IHttpHandler的時候是否能夠將這個Handler存入池中以便重用。

四、WebForm:

1.WebForm類繼承於 Page類;而一般處理程序類實現於 IHttpHandler 接口。但是,Page類實現了IHttpHandler接口,所以,WebForm類也實現了這個接口。

 

2.WebForm:分 aspx 和aspx.cs 兩個前后台文件,aspx主要用來當做“html模板”用,而aspx.cs就是頁面處理代碼。

(1)前台頁面:
(A)頁面類指令集(給編譯器用):
<<A href='mailto:%@PageLanguage="C'>%@PageLanguage="C#" CodeBehind="01WebForm.aspx.cs" Inherits="_01WebForm._01WebForm" %>
(B)CodeBehind:指定對應的后台文件名稱
(C)Inherits:指定了前台類繼承於哪個后台類。

(D)AutoEventWireup: 用來打開頁面生命周期方法的自動注冊機制,默認為打開(控件事件除外)。當某個頁面開啟事件自動注冊機制,那么被瀏覽器請求時,asp.net內部機制會自動的創建被請求的前台頁面類對象,同時,掃描后台頁面類里的所有方法名,一旦找到符合約定的方法名,如:Page_Load,就會將其自動添加到 Page類父類Control里的一個對應的事件委托中。

 

(2)后台頁面:

(A)直接通過Page類的屬性訪問到當前請求上下文對象里對應的屬性
protectedvoid Page_Load(object sender, EventArgs e)
{
//Response -> context.Response
//Request -> context.Reqeust
//Session -> context.Session
}
(B)Page_Load方法被 Page類里的ProcessRequest調用:
    Page類的事件自動注冊機制會自動的根據后台類里的事件方法名來找到 Page_Load方法,將此方法注冊到 Page類一個 OnLoad事件(委托)中。
    在頁面被請求執行的時候,在11-12事件中間調用Page類的ProcessRequest方法, 里面就會調用這個Page的頁面生命周期,其中就會調用 OnLoad事件從而執行注冊在里面的 Page_Load方法。

(3)后台向前台頁面輸出數據方式:

(A)直接在后台通過Page_Load方法,執行Response.Write。

     缺點:生成的HTML代碼全都輸出在頁面的最上面。因為Page類ProcessReqeust方法會先執行Load事件,此時就通過事件調用執行了我們的后台類里寫的Page_Load方法;在頁面生命周期最后,才調用 RenderControl方法,按照前台頁面類的代碼生成整個HTML頁面;所以,Load里輸出的在前,前台頁面的在后。


免責聲明!

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



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