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

ASP
asp #include命令
推荐下天枫常用ASP函数封装,推荐大家使用
asp最简单最实用的计数器
用asp实现的iframe批量替换工具
ASPWebPack 代码 提供下载
asp分页生成html的程序脚本代码
比较不错的asp单表单字段多条件查询
asp下用replace非正则实现代码运行功能的代码
UpdatePanel触发javascript脚本的方法附代码
生成EAN13标准的条形码的ASP代码实例
asp空间奸商查询系统
ASPWebPack(整站文件备份系统) v1.0.2 黑客也用
ASP+FSO可视化目录编历(可增、删、改)下载
提高ASP效率的五大技巧
ASP生成随机字符串(数字+大小写字母)的代码
ASP下存储过程编写入门全接触
利用 cache 做对比静态页的网页技术
ASP生成静态文件编码为UTF-8格式的HTML文件
ASP下的两个防止SQL注入式攻击的Function
asp下的风讯用的SQL通用防注入模块提供了

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 97 ::
收藏到网摘: 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