您当时的方位:主页 > 言语编程 > ASP.NET

在ASP与ASP.NET之间同享对话状况(2)

2014-10-28  
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复制到本地目录并运用r