当前位置: 首页 > 图文教程 > 网络编程 > ASP > 在ASP与ASP.NET之间共享对话状态(2)

ASP
IIS的安装和配置全过程
多语言网站开发技术分析
ASP完美转化ACCESS为SQL数据库连接
解决IIS下UTF-8文件报错乱码的问题
ASP打开任何类型文件提示保存
ASP教程:Stream 速查
asp生成UTF-8格式的文件
动态网站建站应知应会
2000/XP IIS配置问题
怎样在xp下配置iis
ASP教程:数组数据排序的程序例子
ASP教程:ASP是不区分大小写
一些语言的标识符的命名规则
ASP教程:表单内容提交到XML文件中
ASP是不是值得学习呢?
详细的关于ASP缓存类的教程
ASP教程:ASP关于数组的应用技巧
ASP教程:Expires 属性的介绍
SQL关于特殊字符处理的基本方法
XMLHTTP实时进行表单数据的校验

在ASP与ASP.NET之间共享对话状态(2)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 70 ::
收藏到网摘: n/a

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