65.9K
CodeProject 正在变化。 阅读更多。
Home

.Net 2.0 中的备份和恢复会话

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.09/5 (5投票s)

2008年1月25日

CPOL

1分钟阅读

viewsIcon

28968

切换用户或模拟用户时非常有用

引言

这段代码将您的会话备份为字节流。当您切换用户或模拟用户并需要清除当前会话时,它很有用。您可以将此字节流存储在新创建的会话中作为会话变量,并且可以非常简单地从该字节流中检索旧会话数据。当您使用 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 个小时来寻找执行此操作的代码,但最终也没有找到完全相同的代码,因此我只想与您分享此代码,以防有人需要执行此类操作。我需要这样做是因为管理员需要一直模拟用户,并且当他取消模拟时,会丢失所有信息,这就是我提出此解决方案的原因。

© . All rights reserved.