ASP.NET不是一種語言,而是建立動態Web頁的一種強大的服務器端技術,它是Microsoft.NET Framework中一套用於生成Web應用程序和Web服務的技術,,利用公共語言運行時(Common Language Runtime)在服務器後端爲用戶提供創建強大的企業級Web應用服務的編程框架。javascript
ASP.NET頁在服務器上執行,並生成發送到桌面或瀏覽器的標記(如 HTML、XML或者WML)。可使用任何.NET兼容語言(好比Visual Basic、C#)編寫Web服務文件中的服務器端(而不是客戶端)邏輯。ASP.NET頁使用一種由事件驅動的、已編譯的編程模型,這種模型能夠提升性能並支持將用戶界面層同應用程序邏輯層相隔離。html
ASP與ASP.NET雖然都是微軟公司的兩項Web技術,但因爲它們誕生的時間(1996VS2002)與背景不一樣,因此它們之間的區別相對比較大,主要區別在開發語言、運行機制、運行環境、開發方式等方面的不一樣。java
區別以下:程序員
(1)開發語言不一樣:ASP的開發語言僅侷限於使用VBS/JS腳本語言混合html來編程,給客戶端腳本添加代碼和給頁面添加ASP代碼的方法是同樣的。面試
ASP.NET的開發語言更爲普遍,可使用符合.NET Framework規範的任何一種功能完善的strongly-type編程語言(好比Visual Basic、C#)。數據庫
(2)運行機制不一樣:ASP是解釋型的編程框架,因沒有事先編譯,而是一邊解釋一邊執行,故而頁面的執行效率相對比較低。ASP.NET是編譯型的編程框架,服務器上運行的是已經編譯好的代碼,所以能夠利用早期綁定來實時編譯,進而提升執行效率。編程
(3)運行環境不一樣:ASP的運行環境是Windows操做系統及IIS。ASP.NET的運行環境除了Windows操做系統及IIS,還須要安裝.NET Framework。後端
(4)開發方式不一樣:ASP將用戶界面層和應用程序邏輯層的代碼混合寫在一塊兒,所以在維護和重用方面比較困難。ASP.NET將用戶界面層和應用程序邏輯層的代碼分離開,程序的複用性和維護性都獲得了提升。瀏覽器
(5)誕生的時間不一樣:1996年11月,Microsfot公司推出了ASP(Active Server Pages)技術。2002年01月,Microsfot公司推出了ASP.NET技術。緩存
擴展:
ASP.Net和ASP的最大區別在於編程思惟的轉換,而不只僅在於功能的加強。ASP使用VBS/JS這樣的腳本語言混合html來編程,而那些腳本語言屬於弱類型、面向結構的編程語言,而非面向對象,這就明顯產生如下幾個問題:
一、代碼邏輯混亂,難於管理:因爲ASP是腳本語言混合html編程,因此你很難看清代碼的邏輯關係,而且隨着程序的複雜性增長,使得代碼的管理十分困難。
二、代碼的可重用性差:因爲是面向結構的編程方式,而且混合html,因此可能頁面原型修改一點,整個程序都須要修改,更別提代碼重用了。
三、弱類型形成潛在的出錯可能:儘管弱數據類型的編程語言使用起來會方便一些,但相對於它所形成的出錯概率是遠遠得不償失的。
以上是語言自己的弱點,在功能方面ASP一樣存在問題,第一是功能太弱,一些底層操做只能經過組件來完成,在這點上是遠遠比不上PHP/JSP,其次就是缺少完善的糾錯/調試功能,這點上ASP/PHP/JSP差很少。
那麼,ASP.Net有哪些改進呢?
ASP.Net擺脫了之前ASP使用腳本語言來編程的缺點,理論上可使用任何編程語言包括C++ , VB , JS等等,固然,最合適的編程語言仍是MS爲.Net Frmaework專門推出的C#(它能夠看做是VC和Java的混合體吧。首先它是面向對象的編程語言,而不是一種腳本,因此它具備面向對象編程語言的一切特性,好比封裝性、繼承性、多態性等等,這就解決了剛纔談到的ASP的那些弱點。封裝性使得代碼邏輯清晰,易於管理,而且應用到ASP.Net上就可使業務邏輯和Html頁面分離,這樣不管頁面原型如何改變,業務邏輯代碼都沒必要作任何改動;繼承性和多態性使得代碼的可重用性大大提升,你能夠經過繼承已有的對象最大限度保護你之前的投資。而且C#和C++、Java同樣提供了完善的調試/糾錯體系。)
ASP(Active Server Pages)是Microsfot公司1996年11月推出的WEB應用程序開發技術,它既不是一種程序語言,也不是一種開發工具,而是一種技術框架,不須使用微軟的產品就能編寫它的代碼,能產生和執行動態、交互式、高效率的服務器的應用程序。運用ASP可將VBscript、javascript等腳本語言嵌入到HTML中,即可快速完成網站的應用程序,無需編譯,可在服務器端直接執行。容易編寫,使用普通的文本編輯器編寫,如記事本就能夠完成。由腳本在服務器上而不是客戶端運行,ASP所使用的腳本語言都在服務端上運行,用戶端的瀏覽器不須要提供任何別的支持,這樣大提升了用戶與服務器之間的交互的速度。此外,它可經過內置的組件實現更強大的功能,如使用ADO能夠輕鬆地訪問數據庫。
以後,微軟又推出ASP.NET。這不是ASP的簡單升級,而是全新一代的動態網頁實現系統,用於一臺WEB服務器創建強大的應用程序。是微軟發展的新體系結構.NET的一部分,是ASP和.NET技術的結合。提供基於組件、事件驅動的可編程網絡表單,大大簡化了編程。還能夠用ASP.NET創建網絡服務。
一般狀況下,Application不會被程序員頻繁地使用,但在一些特殊場合下Application會被常常地用到。
Application對象在實際網絡開發中的用途就是記錄整個網絡的信息,在給定的應用程序的多用戶之間共享信息,並在服務器運行期間持久的保存數據。Application對象具有控制訪問應用層數據的方法,並可用於在應用程序啓動和中止時觸發過程的事件。
Application具有如下4個特性:
信息量大小爲任意大小
應用於整個應用程序/全部用戶
保存在服務器端
做用域和保存時間是在整個應用程序的生命期
解析:
Application是用來保存全部用戶共用的信息,在ASP時代,若是要保存的數據在應用程序生存期內不會或者不多發生改變,那麼使用Application是理想的選擇。可是在ASP.NET開發環境中,程序員一般把相似的配置數據放在Web.config中。若是要使用Application的話,要注意的是全部的寫操做都要在Global.asax文件中的Application_OnStart事件中完成。如如下示例代碼所示:
/*下面的代碼在Global.asax文件中設置*/ Application.Lock(); //將Application對象加鎖操做。 Application[「UserID」]=」Hellokitty」; //將Hello kitty值賦值給Application[「UserID」]對象 Application.Unlock(); ///將Application對象解鎖
如下示例代碼是在頁面中調用Application,以下所示:
/*在Webpage中調用Application對象,請參考下面的用法。*/ String UserName=Application[「UserID」].ToString()
注意:儘管可使用Application.Lock()避免衝突,可是它串行化了對Application的請求,會產生嚴重的性能瓶頸。所以,仍應儘可能避免使用Application保存大數據量信息。
若是在應用程序中使用Application對象,一個須要考慮的問題是任何寫操做都要在Application_OnStart事件中完成。儘管使用Application.Lock和Applicaiton.Unlock方法來避免寫操做的同步,可是因爲它串行化了對Application對象的請求,當網站訪問量大的時候會產生嚴重的性能瓶頸,所以最好不要用此對象保存大的數據集合。下面舉一個在線用戶統計的例子來講明這個問題:
using System; using System.Collections; using System.ComponentModel; using System.Web; using System.Web.SessionState; using System.IO; public class Global :System.Web.HttpApplication // Global 的摘要說明。 { privateSystem.ComponentModel.IContainer components = null; //必需的設計器變量。 privateFileStream fStream; privateStreamReader reader; //讀字符流 privateStreamWriter writer; //寫字符流 public Global() { InitializeComponent(); //加載組件的已編譯的頁 } protected void Application_Start(Object sender, EventArgs e) { Application["CurrentUser"]=0; //初始化爲0 //文件不存在,建立文件 fStream =File.Open(Server.MapPath("counts.text"),FileMode.OpenOrCreate); reader = newStreamReader(fStream); //要讀取的完整路徑 //從當前流中讀取一行字符並將數據做爲字符串返回 Application["AllUser"]= Convert.ToInt32(reader.ReadLine()); reader.Close();/ //關閉流 } //當用戶訪問網站時,在線用戶+1,總訪問數+1 protected void Session_Start(Object sender, EventArgs e) { Application.Lock(); //同步,避免同時寫入 Application["CurrentUser"]=(int)Application["CurrentUser"]+1; //總在線用戶數 //訪問網站的總用戶數 Application["AllUser"] =(int)Application["AllUser"]+ 1; fStream = newFileStream(Server.MapPath("counts.text"), FileMode.OpenOrCreate,FileAccess.ReadWrite); //實現一個寫入流,使其以一種特定的編碼向流中寫入字符 writer = newStreamWriter(fStream); //把訪問網站的總用戶數再次寫入到文件 writer.WriteLine(Application["AllUser"].ToString()); writer.Close(); //關閉寫入流 Application.UnLock(); //同步結束 } //當前用戶退出網站時,在線用戶數量-1 protected void Session_End(Object sender, EventArgs e) { Application.Lock(); Application["CurrentUser"] =(int)Application["CurrentUser"]- 1; //總在線用戶數量-1 Application.UnLock(); } WebPage.ASPX頁面的示例代碼以下: private void Page_Load(object sender, System.EventArgs e) { this.Label1.Text = "當前站點的用戶數:" +Application["CurrentUser"].ToString(); this.Label2.Text="訪問過站點的總用戶數:" +Application["AllUser"].ToString(); }
在深刻學習ASP.NET以前,首先須要先了解一下ASP.NET的基本運行機制。
(1)當第一次訪問頁面時,頁面請求首先依次通過HttpModuls和HttpHandler(處理程序)的處理,服務器接收到HttpHandler的請求後將跳轉到須要訪問的頁面,而後ASP.NET Engine負責找到這個頁面後臺的類,並實例化爲一個臨時對象,在此過程當中會觸發一系列的事件,其中一部分事件須要通過對象中的方法進行處理,以後服務器會將這個處理後頁面移交給Response對象,而後由Response對象將這個頁面發送到客戶端。這就是第一條路線。
(2)由於服務器之間的會話已經創建,在服務器中的臨時對象已經創建,因此在這個頁面上從新提交一些信息並再次向服務器發送請求時,是不用再通過初始化頁面這一部分工做的。故這第二條路線是依次提交HttpModuls、HttpHandler請求,而後直接與臨時對象交互並返回的。
(3)第三條路線與第二條路線的不一樣之處在於,在處理請求時,若是涉及到須要調用ASP.NET Cache(既ASP.NET緩存),臨時對象將直接從ASP.NET緩存提取信息並返回。
(4)第四條路線是在刷新頁面的時候,服務器接收到並發現這個請求先前曾經處理過,並將處理結果存儲到由一個默認的HttpModule管理的輸出緩存中,那麼此時就能夠直接從這個緩存中提取信息並返回,而無需再從新處理一遍。
【答案】
當每次請求ASP.NET頁面時,依據不一樣的狀況瀏覽器、服務器、ASP.NET引擎之間將執行這四條路線中的一條路線,經過了解ASP.NET頁面的內部運行機制,程序員能夠在編寫、調試代碼的時候會更加遊刃有餘的。
【考題分析】
在學習ASP.NET頁面生命週期前,須要先了解上一小節介紹的 ASP.NET的基本運行機制。
頁面從建立處處理結束的過程當中 ASP.NET Engine執行的11個事件。
【答案】
在ASP.NET的頁面生命週期中須要經歷Page_Init、LoadViewState、LoadPostData、Page_Load、RaisePostDataChanged、RaisePostBackEvent、Page_PreRender、SaveViewState、Page_Render、Handle、UnLoad這十個事件。每次ASP.NET頁面請求,都經歷着一樣的過程:從初始化對象到銷燬對象。經過了解ASP.NET頁面的頁面生命週期,程序員能夠在編寫、調試代碼的時候會更好地把握這些事件之間的關係。