ASP.NET深入淺出系列1-ASP.NET編程模型

來源:互聯網
上載者:User

一、HTTP協議:
1、HTTP協議是什麼
我們在瀏覽器的地址欄裡輸入的網站地址叫做URL(UniformResourceLocator,統一資源定位器)。就像每家每戶都有一個門牌地址一樣,每個網頁也都有一個Internet地址。當你在瀏覽器的地址框中輸入一個URL或是單擊一個超級連結時,URL就確定了要瀏覽的地址。瀏覽器通過超文字傳輸通訊協定 (HTTP)(HTTP),將Web伺服器上網站的網頁代碼提取出來,並翻譯成漂亮的網頁。因此,在我們認識HTTP之前,有必要先弄清楚URL的組成,例如:http://www.microsoft.com/china/index.htm。它的含義如下:

  • http://:代表超文字傳輸通訊協定 (HTTP),通知microsoft.com伺服器顯示Web頁,通常不用輸入;
  • www:代表一個Web(全球資訊網)伺服器;
  • Microsoft.com/:這是裝有網頁的伺服器的網域名稱,或站台伺服器的名稱;
  • China/:為該伺服器上的子目錄,就好像我們的檔案夾;
  • Index.htm:index.htm是檔案夾中的一個HTML檔案(網頁)。

我們知道,Internet的基本協議是TCP/IP協議,然而在TCP/IP模型最上層的是應用程式層(Applicationlayer),它包含所有高層的協議。高層協議有:檔案傳輸通訊協定FTP、電子郵件傳輸協議SMTP、網域名稱系統服務DNS、網路新聞傳輸通訊協定NNTP和HTTP協議等。HTTP協議(Hypertext Transfer Protocol,超文字傳輸通訊協定 (HTTP))是用於從WWW伺服器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證電腦正確快速地傳輸超文字文件,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先於圖形)等。這就是你為什麼在瀏覽器中看到的網頁地址都是以“http://”開頭的原因。
2、HTTP工作原理
  由於HTTP協議是基於請求/響應範式的(相當於客戶機/伺服器)。一個客戶機與伺服器建立串連後,發送一個請求給伺服器,請求方式的格式為:統一資源識別項(URL)、協議版本號碼,後邊是MIME資訊包括請求修飾符、客戶機資訊和可能的內容。伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號碼、一個成功或錯誤的代碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。

  許多HTTP通訊是由一個使用者代理程式初始化的並且包括一個申請在原始伺服器上資源的請求。最簡單的情況可能是在使用者代理程式和伺服器之間通過一個單獨的串連來完成。在Internet上,HTTP通訊通常發生在TCP/IP串連之上。預設連接埠是TCP80,但其它的連接埠也是可用的。但這並不預示著HTTP協議在Internet或其它網路的其它協議之上才能完成。HTTP只預示著一個可靠的傳輸。

  在WWW中,“客戶”與“伺服器”是一個相對的概念,只存在於一個特定的串連期間,即在某個串連中的客戶在另一個串連中可能作為伺服器。基於HTTP協議的客戶/伺服器模式的資訊交換過程,它分四個過程:建立串連、發送請求資訊、發送響應資訊、關閉串連。

 

  

其實簡單說就是任何伺服器除了包括HTML檔案以外,還有一個HTTP駐留程式,用於響應使用者請求。你的瀏覽器是HTTP客戶,向伺服器發送請求,當瀏覽器中輸入了一個開始檔案或點擊了一個超級連結時,瀏覽器就向伺服器發送了HTTP請求,此請求被送往由IP地址指定的URL。駐留程式接收到請求,在進行必要的操作後回送所要求的檔案。在這一過程中,在網路上發送和接收的資料已經被分成一個或多個資料包(packet),每個資料包包括:要傳送的資料;控制資訊,即告訴網路怎樣處理資料包。TCP/IP決定了每個資料包的格式。如果事先不告訴你,你可能不會知道資訊被分成用於傳輸和再重新組合起來的許多小塊。

  也就是說商家除了擁有商品之外,它也有一個職員在接聽你的電話,當你打電話的時候,你的聲音轉換成各種複雜的資料,通過電話線傳輸到對方的電話機,對方的電話機又把各種複雜的資料轉換成聲音,使得對方商家的職員能夠明白你的請求。這個過程你不需要明白聲音是怎麼轉換成複雜的資料的。

3、ASP.NET下HTTP協議分析
HTTP請求
我們首先建立一個aspx頁面僅拖上來一個按鈕和一個文字框,開啟Fiddler(這是一款微軟員工開發的HTTP調試工具,http://www.fiddlertool.com/),然後瀏覽剛才建立的頁面。查看Fiddler我們會看到:

上面框的內容其實就是當你敲入地址按斷行符號後瀏覽器提交到伺服器的內容,伺服器就是拿到這些資訊後進行解析,然後根據你的請求提供給你相應的頁面,我們先對這裡的內容進行簡單的介紹:

  • GET:它後面跟隨一個網頁的位置,伺服器接受請求並返回其請求的頁面。除了頁面位置作參數之外,請求還可以跟隨協議的版本如HTTP/1.0等作為參數,以發送給伺服器更多的資訊。
  • Accept-Language: 當前瀏覽器語言
  • Host:指定請求資源的Intenet主機和連接埠號碼,必須表示請求url的原始伺服器或網關的位置。HTTP/1.1請求必須包含主機頭域,否則系統會以400狀態代碼返回。
  • User-Agent:包含發出請求的使用者資訊,這裡標識發出該請求的瀏覽器的類型。
  • Connection:關閉一個串連或保持一個串連有效

HTTP響應

伺服器響應包括一個狀態行,該狀態行由訊息的協議版本和一個退出碼(表示成功或發生錯誤)組成。狀態行後面跟著幾個前序(通常是頁面的內容類型和長度)和主體內容。一個空行將主題內容與訊息的其餘內容分開。如就是剛才訪問頁面的響應內容:

 

伺服器響應包括一個狀態行,該狀態行由訊息的協議版本和一個退出碼(表示成功或發生錯誤)組成。狀態行後面跟著幾個前序(通常是頁面的內容類型和長度)和主體內容。一個空行將主題內容與訊息的其餘內容分開。如就是剛才訪問頁面的響應內容:

第一行的代碼200指示該請求一切正常,server內容為伺服器資訊,Content-Type用於向接收方指示實體的介質類型,指定HEAD方法送到接收方的實體介質類型,這裡提供的意思為編碼為utf-8的文字格式設定。

二、ASP.NET頁面構成

ASP.NET頁面主要包括三個部分:頁面指令,代碼和頁面配置
頁面指令:頁面指令建立該頁面的運行環境,規定HTTP運行庫如何處理該頁面
代碼:包含頁面和控制項事件的處理常式,如果我們使用程式碼後置的話一般不會出現。
頁面配置:頁面配置表示頁面的架構套件括伺服器控制項、文本和HTML標籤。
例子:

頁面例子
<%@ Page Language="C#" %><!--頁面指令-->

<script runat="server"><!--代碼-->
void Button1_Click(Object sender, EventArgs e)
{
    Label1.Text = "Clicked at " + DateTime.Now.ToString();
}
</script>

<html><!--頁面配置-->
<head>
  <title>Single-File Page Model</title>
</head>
<body>
  <form runat="server">
    <div>
       <asp:Label id="Label1" 
         runat="server" Text="Label">
       </asp:Label>
       <br />
       <asp:Button id="Button1" 
         runat="server" 
         onclick="Button1_Click" 
         Text="Button">
      </asp:Button>
    </div>
  </form>
</body>
</html>

 

三、ASP.NET頁面生命週期

ASP.NET 頁運行時,此頁將經曆一個生命週期,在生命週期中將執行一系列處理步驟。這些步驟包括初始化、執行個體化控制項、還原和維護狀態、運行事件處理常式代碼以及進行呈現。瞭解頁的生命週期非常重要,這樣就能在合適的生命週期階段編寫代碼,以達到預期效果。此外,如果開發自訂控制項,則必須熟悉頁生命週期,從而正確地初始化控制項,使用檢視狀態資料填充控制項屬性以及運行所有控制項行為邏輯。

1、對象初始化Init事件:頁面初始化的標誌是Init事件。頁面中的控制項(包括頁面本身)都是在它們最初的Form中被首次初始化的。在成功建立頁面的控制項樹後,對應用程式激發這個事件。當Init事件發生時,在.aspx源檔案中靜態聲明的所有控制項都以執行個體化並取其預設值。應該注意到,這是還沒有檢視狀態資訊可供使用。雖然可以重載OnInit方法,但是系統並不保證這些控制項執行個體是按照怎樣的順序被建立的。

2、載入視圖:在初始化之後,頁面架構立即載入該頁面的檢視狀態(ViewState)。所謂檢視狀態就是一些成對的名稱和數值的集合,例如可以儲存TextBox控制項的ID和Text屬性值。它一般被用於在一個往返行程中存留資訊到伺服器,即參與HTTP請求與響應。

整頁模式狀態被儲存在<input type=”hidden”>欄位中,做為_VIEWSTAE的值進行記錄。該檢視狀態通過ASP.NE自動維護。通過重寫LoadViewState方法組件,開發人員可控制如何還原檢視狀態以及如何將其內容影射到內部狀態。LoadViewState方法就是從ViewState中擷取上一次的狀態,並按照頁面的控制項樹的結構,用遞迴來遍曆整個樹,將對應的狀態恢複到每一個控制項上。

3、處理回傳資料:還原了檢視狀態,頁面樹種的各個控制項的狀態就與瀏覽器上次呈現該頁面時這些控制項所處的狀態相同。下一步需要更新這些控制項的狀態以發送給用戶端。
回傳資料處理階段是各個控制項有機會更新其狀態,以便準確的反映相應的HTML元素在用戶端的狀態。例如,一個伺服器TextBox控制項對應的HTML元素是<input type=text>,在回傳資料階段,TextBox控制項將檢索<input>標記的當前值並用它重新整理其內部狀態。每個控制項負責從以發送的資料中提取相應值,並更新其某些屬性。TextBox控制項將更新Text屬性,而CheckBox控制項將重新整理其Checked屬性。伺服器控制項和HTML元素之間的匹配關係由二者的ID確定。

頁架構將在每個提交資料的控制項上實現IpostBackDataHandler介面,然後激發LoadPostData事件,通過頁面解析發現實現了IpostBackDataHandle介面的控制項,這樣就能正確的回傳資料更新控制項狀態。在識別控制項時,ASP.NET通過匹配控制項的唯一標示符來更新正確的控制項,該標識符具有名稱值集和中的名稱值對。這也就是在所有特定的頁中每個控制項都需要一個唯一識別碼的原因之一。其他的步驟都由架構來完成,例如確定每個標識符在環境中是否唯一以及控制項的基本屬性等。

LostPostData方法的原型如下:

Public virtual bool LoadPostData(string postDatakey, NameValueCollection postCollection)

PostDataKey是標識控制項的關鍵字,可以理解為控制項的ID,postCollection是包含回傳資料的集合,可以理解為檢視狀態值。該方法返回一個bool值,如果是true,則表示控制項狀態因回傳而更改;否則返回false。頁架構會更跟蹤所有返回true的控制項並在這些控制項上調用RaisePostDataChangeEvent事件。

LoadPostData方法是由System..Web.WebControls.Control定義的,而添加的每一個伺服器控制項也是從System..Web.WebControls.Control繼承的,所以對於資料的回傳處理並不需要幹預。

4、載入頁面Load:在回傳資料處理階段結束時,頁面中的所有控制項都根據用戶端上所輸入的更改來更新的狀態。此時,對頁面激發OnLoad事件。對於這個事件,相信大多數朋友都會比較熟悉,用Visual Studio.Net產生的頁面中的Page_Load方法就是響應Load事件的方法,對於每一次請求,Load事件都會觸發,Page_Load方法也就會執行。可以利用該方法執行一些頁面初始化,例如準備好資料庫的連接字串。在事件引用中,為了提高效能,通常使用Page類的IsPostBack屬性判斷是不是資料回傳。

5、回傳更改通知RaisePostDataChanged:如(3)所述,在所有實現了IpostBackDataHandler介面的控制項被正確的回傳資料更新後,每個控制項都有一個布爾值的標識,標識其自上一次提交後改控制項的資料是被更改還是保持其值。然後ASP.NET通過搜尋網頁來尋找任何顯示控制項資料被更改的標識並激發RaisePostDataChanged。RaisePostDataChanged事件直到Load事件發生後,所有控制項被更新後才激發。這保證了在控制項被回傳資料更新前,其他控制項的資料在RaisePostDataChanged事件中沒有被手動更改過。雖然也可以在Page的基礎上自己定義資料更改的事件,但通常這個事件由太大用處。

6、 處理回傳事件RaisePostBackEvent:當回傳更新導致資料改變而引發伺服器端事件後,引發回傳的對象會在RaisePostBackEvent事件中被處理。這種引發回傳的對象往往是一個按鈕被單擊或者其狀態改變而引發回傳的控制項。例如Button觸發樂Onclick事件、用戶端修改了某個文字框的文本、同時將AutoPostBack設定為true、觸發TextChanged事件等。

很多代碼都在這個事件中執行,因為這是控制事件驅動邏輯的理想位置。為了保證呈現到瀏覽器的資料的正確性,在一系列的回傳事件後,RaisePostBackEvent事件最終被激發。基於一致性考慮,會傳中改變的控制項直到這個函數被執行後才被更新。在實際的ASP.NET開發工作中要做的工作就是在此事件發生前處理代碼。

7、預呈現PreRender:在處理回傳事件後,頁面就準備進行呈現。這一階段的標誌是PreRender事件。各個控制項可利用這個很好的時機,以便執行任何需要在儲存檢視狀態和呈現輸出結果的前一刻完成得最後一些更新操作。最終請求的處理都會轉變為發揮伺服器的響應,預呈現這個階段就是執行在最終呈現之前所做的狀態的更改,因為在呈現一個控制項之前,必須更具它的屬性來產生HTML,比如Style屬性。這是典型的例子,這預呈現之前,可以更改一個控制項的Style,當執行預呈現時,就可以把Style儲存下來,做為呈現階段顯示HTML的樣式資訊。

8、儲存狀態SaveViewState:下一個狀態為SaveViewState,在這一狀態中所有控制項以及頁面本身可以重新整理自己的SaveState集合的內容。所得到的檢視狀態隨後得以序列化、進行雜湊運算、進行Base64編碼並關聯到VI-EMSTATE隱藏自端。

9、呈現視圖Render:到這裡,實際上頁面對請求的處理基本就告一段落了,在Render事件中,也調用對象是它們呈現為HTML,然後也收集HTML發送給客戶。客戶接收到HTML標記後進行重組,最終顯示給客戶。當Render事件被重載時,開發人員可以為瀏覽器建立定值的HTML,此時頁面建立的任何HTML都還沒有生效。Render方法用HtmlTextWriter對象做參數並由它產生HTML送給瀏覽器。這主要用於自訂控制項的開發。

10、處置Disposed:執行銷毀控制項前的所有最終清理操作。在此階段必須釋放對昂貴資源的引用,如記憶體的退出、資料庫的串連等。

11、卸載Unload:一個頁面的最後生存標誌就是Unload事件,該事件在頁面對象被解除之前發生。在此事件中,可以調用Dispose方法儘可能釋放佔用的任何關鍵資源(例如,檔案、繪圖物件以及資料庫連接)。

 

參考資料:

http://www.cnblogs.com/framework/archive/2006/10/16/529835.html

http://www.fiddlertool.com

http://www.cnpaf.net/class/http/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.