|
藍森林 http://www.lslnet.com 2006年8月25日 8:28
菜鳥問題,ASP與ASP.NET的區別?
我想學ASP,但有網友說學ASP不如學ASP.NET.可能遲年ASP會給ASP.NET淘汰? :) |
區別在於多了4個字母 .net |
guoshuang在上個帖子中說
好強的回貼 |
這種問題難以三言兩語解釋清楚。
還是拜託看看書吧。 |
簡單的來說 .net是微軟作為重點發展的對象,ASP雖不至於短時間內被淘汰,但將肯定不再會成為win平台下的網絡開發的主流。
如果現在開始學的話,建議還是學.net比較好! |
好像asp.net的文件擴展名是.aspx |
謝謝了,我會用心看下書的,學生就是要學習! |
asp.net能用更強的語言來編寫,如C#,VB.net,asp行嗎?還有asp.net編寫時要比asp方便 |
ASP.NET與ASP的不同 (轉)
來源:中國BS網 karry
關於ASP.Net到底是什麼,恐怕大多數人的理解都不一樣。那麼ASP.Net和Asp有什麼關係?讓我們看下面這個例子,這段代碼是用戶註冊信息模塊提交按鈕點擊事件,作用是將用戶提交的數據存入數據庫中。
public void OnSubmit(Object sender , EventArgs e)
{
if (Page.IsValid)
{
//數據入庫
try
{
BBSUser myUser = new BBSUser() ;
if(!myUser.GetUser(txtUserName.Text))
{
myUser.CreateUser(BBSUser.CreateType.Create , txtUserName.Text , txtPassword.Text ,
txtEmail.Text , txtHomepage.Text , "") ;
}
}
catch(Exception exp)
{
#if DEBUG
Response.Write ("出現異常:" + exp.Message) ;
return ;
#endif//DEBUG
Server.Transfer("error.aspx") ;
}
}
怎麼樣,是不是和你原來習慣使用的ASP有些區別呢?代碼中你見不到數據入庫,而全部封裝到BBSUser類的CreateUser方法中,或許你會說ASP也行呀,做個函數或過程不就行了?是,的確如此,ASP.Net也可以直接把它做成一個過程然後來調用,但如果那樣的話,那就真的只比ASP多一點點而已了。還是讓我們從頭說起吧。
ASP.Net和ASP的最大區別在於編程思維的轉換,而不僅僅在於功能的增強。ASP使用VBS/JS這樣的腳本語言混合html來編程,而那些腳本語言屬於弱類型、面向結構的編程語言,而非面向對象,這就明顯產生以下幾個問題:
1、代碼邏輯混亂,難於管理:由於ASP是腳本語言混合html編程,所以你很難看清代碼的邏輯關係,並且隨著程序的複雜性增加,使得代碼的管理十分困難,甚至超出一個程序員所能達到的管理能力,從而造成出錯或這樣那樣的問題。
2、代碼的可重用性差:由於是面向結構的編程方式,並且混合html,所以可能頁面原型修改一點,整個程序都需要修改,更別提代碼重用了。
3、弱類型造成潛在的出錯可能:儘管弱數據類型的編程語言使用起來回方便一些,但相對於它所造成的出錯幾率是遠遠得不償失的。
以上是語言本身的弱點,在功能方面ASP同樣存在問題,第一是功能太弱,一些底層操作只能通過組件來完成,在這點上是遠遠比不上PHP/JSP,其次就是缺乏完善的糾錯/調試功能,這點上ASP/PHP/JSP差不多。那麼,ASP.Net有哪些改進呢?
ASP.Net擺脫了以前ASP使用腳本語言來編程的缺點,理論上可以使用任何編程語言包括C++ , VB , JS等等,當然,最合適的編程語言還是MS為.Net Frmaework專門推出的C(讀c sharp),它可以看作是VC和Java的混合體吧,儘管MS自己講C#內核中更多的象VC,但實際上我還是認為它和Java更像一些吧。首先它是面向對象的編程語言,而不是一種腳本,所以它具有面向對像編程語言的一切特性,比如封裝性、繼承性、多態性等等,這就解決了剛才談到的ASP的那些弱點。封裝性使得代碼邏輯清晰,易於管理,並且應用到ASP.Net上就可以使業務邏輯和Html頁面分離,這樣無論頁面原型如何改變,業務邏輯代碼都不必做任何改動;繼承性和多態性使得代碼的可重用性大大提高,你可以通過繼承已有的對象最大限度保護你以前的投資。並且C#和C++、Java一樣提供了完善的調試/糾錯體系。
對了,要說明一點,這個教程並不是ASP.Net的入門教程,我假設你對ASP.Net、C#和面向對像編程有一定的瞭解,如果不是這樣的話,請先閱讀有關文章或教程。 |
在ASP與ASP.NET之間共享對話狀態 (轉)
來源 · ·陶剛編譯··yesky
〔前言:〕ASP.NET是微軟提供的最新的開發基於Web的應用程序的技術。它提供了大量的比傳統ASP腳本技術的好處,包括:
1)通過把UI表現層(presentation)與商業邏輯(business logic)分開建立了更好的開髮結構;
2)使用完全編譯的代碼代替了傳統ASP的代碼翻譯;
3)它編譯特性與每個支持的方法協同,這意味著使用ASP.NET的站點比使用傳統的ASP站點的性能更高。
儘管把存在的ASP應用程序轉換到ASP.NET有很多潛在的好處,也有些ASP應用程序任務很重要並且複雜。轉換過程可能需要更多資源並給應用程序帶來更多風險。解決這些問題的途徑之一是同時運行ASP和ASP.NET應用程序,在一個時刻將一個對話轉換為ASP.NET。為了同時運行新舊程序,需要建立一個機制在傳統的ASP與ASP.NET間共享對話狀態。本文討論的是怎樣使用.NET框架組件的類和序列化特性共享狀態信息。
概述
Cookie是Web應用程序識別用戶對話的最常用的方法,可以用於識別傳統的ASP和ASP.NET對話狀態。在ASP腳本中狀態信息保存在內存中,不能與其它應用程序(例如ASP.NET)共享。如果對話狀態使用通用格式保存在微軟SQL Server中,它就可以被傳統的ASP和ASP.NET共同訪問。
在本例中,名為mySession的Cookie用於識別用戶對話。當用戶對Web應用程序作出請求時,將為該用戶產生唯一的Cookie用於識別對話。在隨後的請求中,瀏覽器將該唯一的Cookie發送回服務器用來識別對話。在被請求的Web頁載入前,一個自定義對像將使用該唯一的Cookie從SQL Server中重新載入用戶對話數據。通過自定義對像Web頁中的對話狀態是可以訪問的。Web請求完成後,如果請求終止,對話數據將保存回SQL Server(見圖1)。
圖1.數據流簡單圖
ASP.NET實現
在ASP.NET中每一個Web頁都衍生自System.Web.UI.Page類。Page類集合了HttpSession對象的一個實例用於處理對話數據。在本例中,叫做SessionPage的自定義Page類來衍生自System.Web.UI.Page,提供了類似Page類的所有特性。唯一的區別是默認的HttpSession使用自定義的對話對像重載了(對實例變量使用new修改符,C#允許衍生的類隱藏基類的成員)。
public class SessionPage : System.Web.UI.Page
{
...
public new mySession Session = null;
...
}
自定義的對話類使用HybridDictionary對像來相應保存內存中的對話狀態(HybridDictionary可用於處理任意數量的對話元素)。為了與傳統的ASP通用,該自定義對話對像將限制對話數據類型為字符串型(默認的HttpSession允許對話保存任意類型的數據,不能與傳統的ASP通用)。
[Serializable]
public class mySession
{
private HybridDictionary dic = new HybridDictionary();
public mySession()
{
}
public string this [string name]
{
get
{
return (string)dic[name.ToLower()];
}
set
{
dic[name.ToLower()] = value;
}
}
}
Page類為定制暴露了不同的事件和方法。特別是OnInit方法用於設置Page對象的初始化狀態。如果請求不包含名為mySession的Cookie,將為請求者產生一個新的mySession Cookie。另外,對話數據將使用自定義數據訪問對像SessionPersistence從SQL Server中檢索出來。DSN和SessionExpiration的值從web.config中檢索。
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
cookie = this.Request.Cookies[sessionPersistence.SessionID];
if (cookie == null)
{
Session = new mySession();
CreateNewSessionCookie();
IsNewSession = true;
}
else
Session = sessionPersistence.LoadSession(
Server.UrlDecode(cookie.Value).ToLower().Trim(),
dsn,
SessionExpiration
);
this.Unload += new EventHandler(this.PersistSession);
}
private void CreateNewSessionCookie()
{
cookie = new HttpCookie(sessionPersistence.SessionID,
sessionPersistence.GenerateKey());
this.Response.Cookies.Add(cookie);
}
SessionPersistence類使用微軟.NET框架組件的BinaryFormatter來串行化和並行化對話狀態為二進制格式以提供最佳性能。結果的二進制對話數據接著作為圖像字段類型被存入SQL Server。
public mySession LoadSession(string key, string dsn,
int SessionExpiration)
{
SqlConnection conn = new SqlConnection(dsn);
SqlCommand LoadCmd = new SqlCommand();
LoadCmd.CommandText = command;
LoadCmd.Connection = conn;
SqlDataReader reader = null;
mySession Session = null;
try
{
LoadCmd.Parameters.Add("@ID", new Guid(key));
conn.Open();
reader = LoadCmd.ExecuteReader();
if (reader.Read())
{
DateTime LastAccessed =reader.GetDateTime(1).AddMinutes(SessionExpiration);
if (LastAccessed >= DateTime.Now)
Session = Deserialize((Byte[])reader["Data"]);
}
}
finally
{
if (reader != null)
reader.Close();
if (conn != null)
conn.Close();
}
return Session;
}
private mySession Deserialize(Byte[] state)
{
if (state == null) return null;
mySession Session = null;
Stream stream = null;
try
{
stream = new MemoryStream();
stream.Write(state, 0, state.Length);
stream.Position = 0;
IFormatter formatter = new BinaryFormatter();
Session = (mySession)formatter.Deserialize(stream);
}
finally
{
if (stream != null)
stream.Close();
}
return Session;
}
在請求的末尾,Page類的Unload事件被啟動了,一個同Unload事件一起註冊的事件處理方法將串行化對話數據為二進制格式並將結果二進制數據存入SQL Server。
private void PersistSession(Object obj, System.EventArgs arg)
{ sessionPersistence.SaveSession(
Server.UrlDecode(cookie.Value).ToLower().Trim(), dsn, Session, IsNewSession);
}
public void SaveSession(string key, string dsn,
mySession Session, bool IsNewSession)
{
SqlConnection conn = new SqlConnection(dsn);
SqlCommand SaveCmd = new SqlCommand();
SaveCmd.Connection = conn;
try
{
if (IsNewSession)
SaveCmd.CommandText = InsertStatement;
else
SaveCmd.CommandText = UpdateStatement;
SaveCmd.Parameters.Add("@ID", new Guid(key));
SaveCmd.Parameters.Add("@Data", Serialize(Session));
SaveCmd.Parameters.Add("@LastAccessed", DateTime.Now.ToString());
conn.Open();
SaveCmd.ExecuteNonQuery();
}
finally
{
if (conn != null)
conn.Close();
}
}
private Byte[] Serialize(mySession Session)
{
if (Session == null) return null;
Stream stream = null;
Byte[] state = null;
try
{
IFormatter formatter = new BinaryFormatter();
stream = new MemoryStream();
formatter.Serialize(stream, Session);
state = new Byte[stream.Length];
stream.Position = 0;
stream.Read(state, 0, (int)stream.Length);
stream.Close();
}
finally
{
if (stream != null)
stream.Close();
}
return state;
}
SessionPage類以及與它相關的類被封裝在SessionUtility組件中。在一個新ASP.NET項目中,需要作SessionUtility組件的引用,為了與傳統的ASP代碼共享對話,每個頁面由SessionPage代替Page類衍生出來。一旦移植完成了,新應用程序能通過說明SessionPage類中定義的對話變量切換回使用原來的HttpSession對像來顯示基本的HttpSession。
ASP實現
原來的ASP對話只能將對話數據保存在內存中。為了將對話數據保存到SQL Server,需要寫一個自定義的Visual Basic 6.0 COM對像代替現在的對話對像來管理對話狀態。該COM對像在每個Web請求開始時被初始化,並從SQL Server重新載入對話數據。ASP腳本完成時,該對像將終止並把對話狀態將返回到SQL Server。
Visual Basic 6 COM Session對象的主要目的是提供對微軟Internet信息服務器(IIS)內部對象的訪問。Visual Basic 6 COM對話對像使用SessionUtility組件的mySession類來保存對話狀態,SessionUtility的SessionPersistence類用於載入和保存對話數據到SQL Server。使用regasm.exe工具將mySession和 SessionPersistence類作為COM對像暴露。regasm.exe工具可以註冊並為COM客戶端建立一個類型庫來使用框架組件類。
在對象的構造函數中狀態信息被重新載入。構造函數(class_initialize)首先從Application對像中檢索對話cookie、對話超時設置(SessionTimeOut)、數據庫連接字符串(SessionDSN),並建立mySession類的一個實例來保持對話數據。接著構造函數將試圖重新使用給定的cookie從SQL Server中載入對話數據。如果SQL Server中沒有對話信息,或者對話已經終止,將產生一個新的cookie。如果SQL Server返回了對話狀態數據,對話狀態信息將保存在mySession對像中。
Private Sub Class_Initialize()
On Error GoTo ErrHandler:
Const METHOD_NAME As String = "Class_Initialize"
Set mySessionPersistence = New SessionPersistence
Set myObjectContext = GetObjectContext()
mySessionID = ReadSessionID()
myDSNString = GetConnectionDSN()
myTimeOut = GetSessionTimeOut()
myIsNewSession = False
Call InitContents
Exit Sub
ErrHandler:
Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description
End Sub
Private Sub InitContents()
On Error GoTo ErrHandler:
Const METHOD_NAME As String = "InitContents"
If mySessionID = "" Then
Set myContentsEntity = New mySession
mySessionID = mySessionPersistence.GenerateKey
myIsNewSession = True
Else
Set myContentsEntity =mySessionPersistence.LoadSession(mySessionID, myDSNString, myTimeOut)
End If
Exit Sub
ErrHandler:
Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description
End Sub
如果對像實例超出了腳本的範圍,將執行解構函數(class_terminate)。解構函數將使用SessionPersistence.SaveSession()方法保持對話數據。如果是一個新對話,解構函數將新cookie發送回瀏覽器。
Private Sub Class_Terminate()
On Error GoTo ErrHandler:
Const METHOD_NAME As String = "Class_Terminate"
Call SetDataForSessionID
Exit Sub
ErrHandler:
Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description
End Sub
Private Sub SetDataForSessionID()
On Error GoTo ErrHandler:
Const METHOD_NAME As String = "SetDataForSessionID"
Call mySessionPersistence.SaveSession(mySessionID,
myDSNString, myContentsEntity, myIsNewSession)
If myIsNewSession Then Call WriteSessionID(mySessionID)
Set myContentsEntity = Nothing
Set myObjectContext = Nothing
Set mySessionPersistence = Nothing
Exit Sub
ErrHandler:
Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description
End Sub
例程
例程設計為增加並顯示一個數字。不管載入了哪個頁面,由於數字值保存在SQL Server中並在ASP和ASP.NET間共享,數字將不斷增加。
建立例程的步驟
1. 建立一個新數據庫SessionDemoDb。
2. 建立新表SessState(osql.exe -E -d SessionDemoDb -i Session.sql)。
3. 建立新虛擬目錄Demo。
4. 在ASP配置頁中關閉ASP對話。
5. 將web.config、testPage.aspx、Global.asa、testPage.asp和GlobalInclude.asp複製到虛擬目錄。
6. 更新Global.asa和web.config中的DSN字符串設置。對話超時設置是可選的,默認為20分鐘。
7. 將SessionUtility.dll安裝到全局組件緩存(gacutil /i SessionUtility.dll)。
8. 使用regasm.exe把SessionUtility.dll作為COM對像暴露(regasm.exe SessionUtility.dll /tlb:SessionUtility.tlb)。
9. 將SessionManager.dll複製到本地目錄並使用regsvr32.exe註冊(regsvr32 SessionManager.dll)。
10. 賦予IUSR_<計算機名>帳戶讀取和運行訪問SessionMgr.dll的權限。
運行例程的步驟
1. 打開微軟Internet Explorer。
2. 為傳統的ASP中載入testPage.asp。數字"1"將出現在Web頁中。
3. 點擊Internet Explorer的刷新來重新載入該頁面。數字將增加。
4. 為ASP.NET改變URL為testPage.aspx。數字仍然增加。
5. 如果使用testPage.aspx開始,過程相同。
在存在的ASP應用程序中插入COM對像
開發ASP應用程序的一個通常的習慣是在每個腳本開始時包含一個文件來共享代碼和常量。插入自定義對話對象的最後途徑是在公有包含文件中加入示例代碼。最後一步簡單地使用自定義對話變量名代替了所有到對話對象的引用。
限制/改進
本方案不支持在Session對像中保存了COM對象的ASP應用程序。在這種情況下,為了使用自定義對話對象,需要一個自定義的調度器來串行化/並行化狀態。此外,本方案也不支持保存字符串類型數組。做一些附加工作可以實現該特性:使用Visual Basic 6.0的Join函數在保存到對話對像前將數組元素連接成一個字符串,反向操作可以使用Visual Basic 6.0的Split函數將字符串分解為獨立的數組元素。在.NET框架組件中,Join和Split方法使String類的成員。
結論
ASP.NET提出了新的編程範例和體系結構,並提供了許多比傳統ASP的好處。儘管將ASP移植到ASP.NET的過程不簡單,ASP.NET更好的編程模型和更高的性能將使轉換過程值得。除了在Session對像中保存COM對象的特例,本文討論的途徑提供了一個簡單實現遷移的解決方案。 |
不斷學習中 |
|