中國最大的web開發資源網站及技術社區,
ASP實現
本機ASP會話只能將會話數據存儲在內存中。為了將會話數據存儲到SQL Server,編寫了自定義Microsoft®VisualBasic®6.0COM對象來管理會話狀態,而不是使用本機會話對象。此COM對象將在每個Web請求的開頭實例化,並從SQL Server重新加載會話數據。 ASP腳本完成後,此對象將被終止,並且會話狀態將持續回到SQL Server。
Visual Basic 6 Com Session對象的主要目的是提供對Microsoft®Internet信息服務器固有對象的訪問。 Visual Basic 6.0 COM會話對象使用SessionUtility組件的MySession類以保持會話狀態,以及SESSISTENTION的SessionUtility類,以加載和保存SQL Server的會話數據。使用Regasm.exe實用程序將MySession和SessionPersistence類作為COM對象。 Regasm.exe實用程序可以註冊並為COM客戶端創建類型庫,以便使用框架類。
會話狀態信息在對象的構造過程中被重新加載。構造函數(class_initialize)將首先從應用程序對象檢索會話cookie,會話超時(sessionTimeOut)和數據庫連接字符串(sessiondsn),並創建一個類Mysession的實例以保存會話數據。然後,構造函數將嘗試使用給定的cookie從SQL Server重新加載會話數據。如果SQL Server沒有會話信息,或者會話已過期,則將發出新的cookie。如果SQL SEVE確實使用會話狀態數據返回,則會狀態將存儲在MySession對像中。
私有子類_initialize()
關於錯誤的Goto Errhandler:
const method_name as string = class_initialize
設置MySessionSpersistence =新的sessionpersistence
設置MyObjectContext = getObjectContext()
mySessionId = readSessionId()
myDSNString = getConnectiondsn()
mytimeout = getsessionTimeOut()
myisnewsession = false
致電Initcontents
出口子
Errhandler:
err.Rier.rier.number,method_name&:&err.source,err.Description
結束子
私人子啟動()
關於錯誤的Goto Errhandler:
const method_name as string = initcontents
如果mysessionid =然後
設置mycontentsentity =新的Mysession
mySessionId = mySessionpersistence.generekey
myisnewsession = true
別的
設置mycontentsentity =
mySessionSpersistence.loadsession(mySessionId,mydsnstring,mytimeout)
如果結束
出口子
Errhandler:
err.Rier.rier.number,method_name&:&err.source,err.Description
結束子
當對象實例不在腳本中時,destructor(class_terminate)將執行。驅動器將使用sessionPersistence.savesession()方法持續存在會話數據。如果這是一個新會話,則驅動器還將將新的cookie發送回瀏覽器。
私有子類terminate()
關於錯誤的Goto Errhandler:
const method_name as string = class_terminate
致電setdataforsessessid
出口子
Errhandler:
err.Rier.rier.number,method_name&:&err.source,err.Description
結束子
私人子setDataforSession()
關於錯誤的Goto Errhandler:
const method_name as string = setDataForsessionId
致電MySessionSpersistence.Savesession(MySessionId,
mydsnstring,mycontentsentity,myisnewsession)
如果Myisnewsession,請致電WritesessionId(MySessionId)
設置mycontentsentity =沒有
設置MyObjectContext = Nothing
設置MySessionSpersistence =沒有
出口子
Errhandler:
err.Rier.rier.number,method_name&:&err.source,err.Description
結束子
您可以通過單擊文章頂部的鏈接來下載ASP.NET Sessionutility項目,COM Session Manager和演示代碼的源代碼。
演示程序
演示程序旨在增加和顯示一個數字。無論加載哪個頁面,數字值都存儲在SQL Server中,並且在經典ASP和ASP.NET之間共享,該數字將繼續增加。
設置演示程序的步驟
創建一個名為SessionDemodb的新數據庫。
創建SESSSTATE表(OSQL.EXE –E –D SessionDemodb --I session.sql)。
創建一個稱為演示的新的虛擬目錄。
在ASP配置選項卡下關閉ASP會話。
將web.config,testpage.aspx,global.asa,testpage.asp和globalinclude.asp複製到虛擬目錄。
在global.asa和web.config中更新DSN字符串設置。會話超時設置是可選的。默認值為20分鐘。
將sessionutility.dll安裝到全局彙編緩存(gacutil /i sessionutility.dll)中。
使用regasm.exe(regasm.exe sessionutility.dll /tlb:sessionutility.tlb)將sessionutility.dll作為com對象曝光。
將sessionManager.dll複製到本地目錄,然後使用regsvr32.exe註冊它(regsvr32 sessionmanager.dll)。
授予iusr_ <machine_name>帳戶已讀取並執行對Sessionmgr.dll的訪問。
運行演示程序的步驟
啟動Microsoft®InternetExplorer。
為經典ASP加載testpage.asp。數字1應顯示在網頁中。
單擊Internet Explorer上的刷新以重新加載頁面。該數字應增加。
將URL更改為asp.net的testpage.aspx。該數字應繼續增加。
可以首先啟動testpage.aspx頁面來重複相同的過程。
將COM對象合併到現有的ASP應用程序中
開發ASP應用程序的一種常見做法是在每個腳本的開頭中包括一個文件,以共享共同的代碼和常數。合併自定義會話對象的最佳方法是將實例代碼添加到共同的包含文件中。最後一步只是用自定義會話變量名稱替換所有對會話對象的引用。
限制/改進
該解決方案將不支持將COM對象存儲在會話對像中的現有ASP應用程序。在這種情況下,需要自定義元帥來序列化/對狀態進行序列化以使用自定義會話對象。此外,該解決方案不支持字符串的存儲類型數組。有了一些額外的努力,可以通過使用Microsoft®VisualBlace®6.0Join函數來實現此功能,將所有數組元素組合到單個字符串中,然後將其存儲到會話對像中。可以使用Visual Basic 6.0拆分函數將字符串拆分回單個數組元素。在.NET框架側,JOIN和SPLIT方法是字符串類的成員。
結論
ASP.NET代表了一種新的編程範式和架構,並且比經典ASP具有許多優勢。儘管從ASP到ASP.NET的移植並不是一個簡單的過程,但是更好的編程模型和改進的ASP.NET性能將使轉換過程值得。除了將COM對象存儲在會話對像中外,本文中描述的方法提供了一種解決方案,可以使遷移過程變得更加簡單。
關於作者
比利·尤恩(Billy Yuen)在北加州的微軟技術中心矽谷工作。該中心側重於Microsoft .NET框架解決方案的開發。可以通過[電子郵件保護]與他聯繫