<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      在ASP與ASP.NET之間共享對話狀態(2)

      [摘要]ASP實現   原來的ASP對話只能將對話數據保存在內存中。為了將對話數據保存到SQL Server,需要寫一個自定義的Visual Basic 6.0 COM對象代替現在的對話對象來管理對話狀態。...
      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對象的特例,本文討論的途徑提供了一個簡單實現遷移的解決方案。



      日韩精品一区二区三区高清