中国最大的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框架解决方案的开发。可以通过[电子邮件保护]与他联系