科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件在ASP与ASP.NET之间共享对话状态(2)

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

ASP实现      原来的ASP对话只能将对话数据保存在内存中。

作者:中国IT实验室 来源:中国IT实验室 2007年9月2日

关键字: 共享 ASP.NET asp

  • 评论
  • 分享微博
  • 分享邮件
    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对象的特例,本文讨论的途径提供了一个简单实现迁移的解决方案。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    闂傚倸鍊搁崐椋庢閿熺姴鐭楅幖娣妼缁愭鏌¢崶鈺佷汗闁哄閰i弻鏇$疀鐎n亞浠炬繝娈垮灠閵堟悂寮婚弴锛勭杸閻庯綆浜栭崑鎾诲冀椤撱劎绋忛梺璺ㄥ櫐閹凤拷

    濠电姷鏁告慨鐑姐€傛禒瀣劦妞ゆ巻鍋撻柛鐔锋健閸┾偓妞ゆ巻鍋撶紓宥咃躬楠炲啫螣鐠囪尙绐為梺褰掑亰閸撴盯鎮惧ú顏呪拺闂傚牊鍗曢崼銉ョ柧婵犲﹤瀚崣蹇旂節婵犲倻澧涢柛瀣ㄥ妽閵囧嫰寮介妸褋鈧帡鏌熼挊澶婃殻闁哄瞼鍠栭幃婊堝煛閸屾稓褰嬮柣搴ゎ潐濞叉ê鐣濈粙璺ㄦ殾闁割偅娲栭悡娑㈡煕鐏炲墽鐭嬫繛鍫熸倐濮婄粯鎷呯粵瀣異闂佹悶鍔嬮崡鍐茬暦閵忋倕鍐€妞ゆ劑鍎卞皬闂備焦瀵х粙鎴犫偓姘煎弮瀹曚即宕卞Ο闀愮盎闂侀潧鐗嗛幊搴㈡叏椤掆偓閳规垿鍩ラ崱妞剧凹濠电姰鍨洪敋閾荤偞淇婇妶鍛櫤闁稿鍊圭换娑㈠幢濡纰嶉柣搴㈣壘椤︾敻寮诲鍫闂佸憡鎸鹃崰搴敋閿濆鏁嗗〒姘功閻绻涢幘鏉戠劰闁稿鎹囬弻锝呪槈濞嗘劕纾抽梺鍝勬湰缁嬫垿鍩為幋锕€宸濇い鏇炴噺閳诲﹦绱撻崒娆戝妽妞ゃ劌鎳橀幆宀勫磼閻愰潧绁﹂柟鍏肩暘閸斿矂鎮為崹顐犱簻闁圭儤鍨甸鈺呮倵濮橆剦妲归柕鍥у瀵粙濡歌閸c儳绱撴担绛嬪殭婵☆偅绻堝濠氭偄绾拌鲸鏅i悷婊冪Ч閹﹢鎳犻鍌滐紲闁哄鐗勯崝搴g不閻愮儤鐓涢悘鐐跺Г閸犳﹢鏌℃担鐟板鐎规洜鍠栭、姗€鎮╅搹顐ら拻闂傚倷娴囧畷鍨叏閹惰姤鈷旂€广儱顦崹鍌炴煢濡尨绱氶柨婵嗩槸缁€瀣亜閺嶃劎鈽夋繛鍫熺矒濮婅櫣娑甸崨顔俱€愬銈庡亝濞茬喖宕洪埀顒併亜閹哄棗浜鹃梺鎸庢穿婵″洤危閹版澘绫嶉柛顐g箘椤撴椽姊虹紒妯哄鐎殿噮鍓欒灃闁告侗鍠氶崢鎼佹⒑閸撴彃浜介柛瀣閹﹢鏁冮崒娑氬幈闁诲函缍嗛崑鍡樻櫠椤掑倻纾奸柛灞剧☉缁椦囨煙閻熸澘顏柟鐓庢贡閹叉挳宕熼棃娑欐珡闂傚倸鍊风粈渚€骞栭銈傚亾濮樺崬鍘寸€规洖缍婇弻鍡楊吋閸涱垽绱遍柣搴$畭閸庨亶藝娴兼潙纾跨€广儱顦伴悡鏇㈡煛閸ャ儱濡煎褜鍨伴湁闁绘ǹ绉鍫熺畳闂備焦瀵х换鍌毼涘Δ鍛厺闁哄洢鍨洪悡鍐喐濠婂牆绀堟慨妯挎硾閽冪喖鏌曟繛褍瀚烽崑銊╂⒑缂佹ê濮囨い鏇ㄥ弮閸┿垽寮撮姀鈥斥偓鐢告煥濠靛棗鈧懓鈻嶉崶銊d簻闊洦绋愰幉楣冩煛鐏炵偓绀嬬€规洟浜堕、姗€鎮㈡總澶夌处

    重磅专题
    往期文章
    最新文章