.Net 2.0 中的备份和恢复会话
切换用户或模拟用户时非常有用
引言
这段代码将您的会话备份为字节流。当您切换用户或模拟用户并需要清除当前会话时,它很有用。您可以将此字节流存储在新创建的会话中作为会话变量,并且可以非常简单地从该字节流中检索旧会话数据。当您使用 SQL 成员资格提供程序并使用 Cookie 维护登录和注销时,这非常有用。
背景
我希望您对会话的工作原理有一些了解,所以我不会在这里放置代码来向您展示如何处理会话。
使用代码
这段代码包含两种方法,一种是备份会话,另一种是恢复会话。我认为您可以在不更改代码的情况下使用这两种方法,因为它非常通用。
代码块应设置为“Formatted”样式,如下所示
Function BackupSession() As Byte()
Dim objSessionData As New SessionState.SessionStateItemCollection
Dim objStream As New System.IO.MemoryStream
Dim objWriter As New System.IO.BinaryWriter(objStream)
For i As Integer = 0 To Me.Session.Count - 1
objSessionData.Item(Me.Session.Keys(i)) = Me.Session.Item(i)
Next
objSessionData.Serialize(objWriter)
Return objStream.ToArray
End Function
Sub RestoreSession(ByVal prevSessionData As Byte())
Dim objStream As New System.IO.MemoryStream
Dim objRedaer As New System.IO.BinaryReader(objStream)
Dim objPrevSession As SessionState.SessionStateItemCollection
objStream.Write(prevSessionData, 0, prevSessionData.Length)
objStream.Seek(0, IO.SeekOrigin.Begin)
objPrevSession = SessionState.SessionStateItemCollection.Deserialize(objRedaer)
For Each key As String In objPrevSession.Keys
Me.Session(key) = objPrevSession.Item(key).ToString
Next
End Sub
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim prevSessionData As Byte()
prevSessionData = Me.BackupSession()
Me.Session.Clear()
'Signout and clear all the cookies of the user.
'Signin new user using new cookie and create new session.
Session("PrevSession") = prevSessionData
'Now when you swith user or cancel emulation, I mean go back to original user.
prevSessionData = nothing
prevSessionData = CType(Session("PrevSession"), Byte())
'Do signin and signout here then
Me.RestoreSession(prevSessionData)
End Sub
关注点
我花了超过 2 个小时来寻找执行此操作的代码,但最终也没有找到完全相同的代码,因此我只想与您分享此代码,以防有人需要执行此类操作。我需要这样做是因为管理员需要一直模拟用户,并且当他取消模拟时,会丢失所有信息,这就是我提出此解决方案的原因。