首先要说明的是,该方法仅对将session存放于sql server中有效。很多人说session存放于sql server中效率太低,我觉得这只能说低一些,不能说太低。这其中的好处更大一些,如果将session存放在进程内,应用程序一重启就没了,有时候很麻烦;存放在进程外和存放在数据库中效率几乎一样。

这个类是从.net framework的源码里得到的,删除了updatesession的部分,只保留了获得session的部分,可以单独作为一个类或者放在类中做私有类使用。

遍历所有session并取值#Region "分析Session的私有类"
 altSerialization
遍历所有session并取值        
' Methods
()
遍历所有session并取值            
Dim typeArray1 As Type() = New Type(21) {}
遍历所有session并取值            typeArray1(
1= GetType(String)
遍历所有session并取值            typeArray1(
2= GetType(Integer)
遍历所有session并取值            typeArray1(
3= GetType(Boolean)
遍历所有session并取值            typeArray1(
4= GetType(DateTime)
遍历所有session并取值            typeArray1(
5= GetType(Decimal)
遍历所有session并取值            typeArray1(
6= GetType(Byte)
遍历所有session并取值            typeArray1(
7= GetType(Char)
遍历所有session并取值            typeArray1(
8= GetType(Single)
遍历所有session并取值            typeArray1(
9= GetType(Double)
遍历所有session并取值            typeArray1(
10= GetType(SByte)
遍历所有session并取值            typeArray1(
11= GetType(Short)
遍历所有session并取值            typeArray1(
12= GetType(Long)
遍历所有session并取值            typeArray1(
13= GetType(UInt16)
遍历所有session并取值            typeArray1(
14= GetType(UInt32)
遍历所有session并取值            typeArray1(
15= GetType(UInt64)
遍历所有session并取值            typeArray1(
16= GetType(TimeSpan)
遍历所有session并取值            typeArray1(
17= GetType(Guid)
遍历所有session并取值            typeArray1(
18= GetType(IntPtr)
遍历所有session并取值            typeArray1(
19= GetType(UIntPtr)
遍历所有session并取值            altSerialization.s_serializedTypes 
= typeArray1
遍历所有session并取值        
End Sub
遍历所有session并取值
()
遍历所有session并取值        
End Sub
遍历所有session并取值

遍历所有session并取值            
Dim numArray1 As Integer()
遍历所有session并取值            
Dim num1 As Integer
遍历所有session并取值            
Dim buffer1 As Byte()
遍历所有session并取值            
Dim formatter1 As System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
遍历所有session并取值            
Dim obj1 As Object = Nothing
遍历所有session并取值            
Select Case CType(reader.ReadByte, TypeID)
遍历所有session并取值                
Case CType(CType(CType(1, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadString
遍历所有session并取值                
Case CType(CType(CType(2, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadInt32
遍历所有session并取值                
Case CType(CType(CType(3, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadBoolean
遍历所有session并取值                
Case CType(CType(CType(4, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return New DateTime(reader.ReadInt64)
遍历所有session并取值                
Case CType(CType(CType(5, TypeID), TypeID), TypeID)
遍历所有session并取值                    numArray1 
= New Integer(4) {}
遍历所有session并取值                    num1 
= 0
遍历所有session并取值                    
GoTo Label_00CA
遍历所有session并取值                
Case CType(CType(CType(6, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadByte
遍历所有session并取值                
Case CType(CType(CType(7, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadChar
遍历所有session并取值                
Case CType(CType(CType(8, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadSingle
遍历所有session并取值                
Case CType(CType(CType(9, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadDouble
遍历所有session并取值                
Case CType(CType(CType(10, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadSByte
遍历所有session并取值                
Case CType(CType(CType(11, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadInt16
遍历所有session并取值                
Case CType(CType(CType(12, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadInt64
遍历所有session并取值                
Case CType(CType(CType(13, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadUInt16
遍历所有session并取值                
Case CType(CType(CType(14, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadUInt32
遍历所有session并取值                
Case CType(CType(CType(15, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return reader.ReadUInt64
遍历所有session并取值                
Case CType(CType(CType(16, TypeID), TypeID), TypeID)
遍历所有session并取值                    
Return New TimeSpan(reader.ReadInt64)
遍历所有session并取值                
Case CType(CType(CType(17, TypeID), TypeID), TypeID)
遍历所有session并取值                    buffer1 
= reader.ReadBytes(16)
遍历所有session并取值                    
Return New Guid(buffer1)
遍历所有session并取值                
Case CType(CType(CType(18, TypeID), TypeID), TypeID)
遍历所有session并取值                    
If (IntPtr.Size = 4Then
遍历所有session并取值                        
Return New IntPtr(reader.ReadInt32)
遍历所有session并取值                    
End If
遍历所有session并取值                    
GoTo Label_01D3
遍历所有session并取值                
Case CType(CType(CType(19, TypeID), TypeID), TypeID)
遍历所有session并取值                    
If (UIntPtr.Size = 4Then
遍历所有session并取值                        
Return New UIntPtr(reader.ReadUInt32)
遍历所有session并取值                    
End If
遍历所有session并取值                    
GoTo Label_0201
遍历所有session并取值                
Case CType(CType(CType(20, TypeID), TypeID), TypeID)
遍历所有session并取值                    formatter1 
= New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
遍历所有session并取值                    
Return formatter1.Deserialize(reader.BaseStream)
遍历所有session并取值                
Case CType(CType(CType(21, TypeID), TypeID), TypeID)
遍历所有session并取值                    
GoTo Label_022B
遍历所有session并取值            
End Select
遍历所有session并取值            
Return obj1
遍历所有session并取值Label_00BD:
遍历所有session并取值            numArray1(num1) 
= reader.ReadInt32
遍历所有session并取值            num1 
= (num1 + 1)
遍历所有session并取值Label_00CA:
遍历所有session并取值            
If (num1 < 4Then
遍历所有session并取值                
GoTo Label_00BD
遍历所有session并取值            
End If
遍历所有session并取值            
Return New Decimal(numArray1)
遍历所有session并取值Label_01D3:
遍历所有session并取值            
Return New IntPtr(reader.ReadInt64)
遍历所有session并取值Label_0201:
遍历所有session并取值            
Return New UIntPtr(reader.ReadUInt64)
遍历所有session并取值Label_022B:
遍历所有session并取值            
Return Nothing
遍历所有session并取值        
End Function
遍历所有session并取值
遍历所有session并取值        
' Fields
遍历所有session并取值
        Private Shared s_serializedTypes As Type()
遍历所有session并取值
遍历所有session并取值        
' Nested Types
 TypeID
遍历所有session并取值            
' Fields
遍历所有session并取值
            [Boolean= 3
遍历所有session并取值            [
Byte= 6
遍历所有session并取值            [
Char= 7
遍历所有session并取值            DateTime 
= 4
遍历所有session并取值            [
Decimal= 5
遍历所有session并取值            [
Double= 9
遍历所有session并取值            Guid 
= 17
遍历所有session并取值            Int16 
= 11
遍历所有session并取值            Int32 
= 2
遍历所有session并取值            Int64 
= 12
遍历所有session并取值            IntPtr 
= 18
遍历所有session并取值            [Null] 
= 21
遍历所有session并取值            [
Object= 20
遍历所有session并取值            SByte 
= 10
遍历所有session并取值            [
Single= 8
遍历所有session并取值            [
String= 1
遍历所有session并取值            TimeSpan 
= 16
遍历所有session并取值            UInt16 
= 13
遍历所有session并取值            UInt32 
= 14
遍历所有session并取值            UInt64 
= 15
遍历所有session并取值            UIntPtr 
= 19
遍历所有session并取值        
End Enum
遍历所有session并取值    
End Class
遍历所有session并取值#
End Region



使用它的核心代码(.net framework对我抛弃的几个bool以及数值进行了一些判断,我没有深究,有朋友研究过的请指点一下。)

遍历所有session并取值Dim sql As String = "select * from ASPState..ASPStateTempSessions where datediff(minute, LockDateLocal, GetDate()) < 20"
遍历所有session并取值
Dim dt As New DataTable
遍历所有session并取值DataDriver.GetRows(sql, dt) 
'该方法用于从数据库中获取一个数据集,可参考我的文章:http://www.cnblogs.com/squirrel_sc/archive/2004/11/04/60447.html
遍历所有session并取值
Dim sTemp As String
遍历所有session并取值
Dim obj As Object
遍历所有session并取值
Dim st As New MemoryStream
遍历所有session并取值
Dim str As New BinaryReader(st)
遍历所有session并取值
Dim col As New System.Collections.Specialized.NameValueCollection
遍历所有session并取值
For i As Integer = 0 To dt.Rows.Count - 1
遍历所有session并取值  
Dim bTemp() As Byte = dt.Rows(i)("SessionItemShort")
遍历所有session并取值  st.SetLength(
0)
遍历所有session并取值  st.
Write(bTemp, 0, bTemp.Length)
遍历所有session并取值  st.
Seek(0, SeekOrigin.Begin)
遍历所有session并取值  
str.ReadInt32()
遍历所有session并取值  
str.ReadBoolean()
遍历所有session并取值  
str.ReadBoolean()
遍历所有session并取值  
str.ReadBoolean()
遍历所有session并取值  
Dim iCount As Integer = str.ReadInt32
遍历所有session并取值  
Dim btTemp As Byte
遍历所有session并取值  
str.ReadInt32()
遍历所有session并取值  
For k As Integer = 0 To iCount - 1
遍历所有session并取值    sTemp 
= str.ReadString
遍历所有session并取值    obj 
= altSerialization.ReadValueFromStream(str)
遍历所有session并取值    
'obj就是sTemp这个session名字对应的内容,它的类型不定。在这里对其进行操作就可以了
遍历所有session并取值
  Next
遍历所有session并取值
Next
遍历所有session并取值
str.Close()
遍历所有session并取值st.Close()
遍历所有session并取值



使用实例:
该方法用于遍历所有session,形成在线用户列表。由于这个操作可能效率较低,所以把结果在内存中缓存1分钟。用户名存在名为UserName的session中。

遍历所有session并取值    Private Shared _onlineUserList As ArrayList
遍历所有session并取值    
Private Shared _onlineUserUpdateTime As DateTime
遍历所有session并取值
 ArrayList
遍历所有session并取值        
If (_onlineUserList Is NothingThen
遍历所有session并取值            _onlineUserList 
= New ArrayList
遍历所有session并取值            _onlineUserUpdateTime 
= Now
遍历所有session并取值        
End If
遍历所有session并取值        
If (_onlineUserUpdateTime.AddMinutes(1< Now OrElse _onlineUserList.Count = 0Then
遍历所有session并取值            _onlineUserList.Clear()
遍历所有session并取值            
Dim sql As String = "select * from ASPState..ASPStateTempSessions where datediff(minute, LockDateLocal, GetDate()) < 20"
遍历所有session并取值
            Dim dt As New DataTable
遍历所有session并取值            DataDriver.GetRows(sql, dt)
遍历所有session并取值            
Dim sTemp As String
遍历所有session并取值            
Dim obj As Object
遍历所有session并取值            
Dim st As New MemoryStream
遍历所有session并取值            
Dim str As New BinaryReader(st)
遍历所有session并取值            
Dim col As New System.Collections.Specialized.NameValueCollection
遍历所有session并取值            
For i As Integer = 0 To dt.Rows.Count - 1
遍历所有session并取值                
Dim bTemp() As Byte = dt.Rows(i)("SessionItemShort")
遍历所有session并取值                st.SetLength(
0)
遍历所有session并取值                st.
Write(bTemp, 0, bTemp.Length)
遍历所有session并取值                st.
Seek(0, SeekOrigin.Begin)
遍历所有session并取值                
str.ReadInt32()
遍历所有session并取值                
str.ReadBoolean()
遍历所有session并取值                
str.ReadBoolean()
遍历所有session并取值                
str.ReadBoolean()
遍历所有session并取值                
Dim iCount As Integer = str.ReadInt32
遍历所有session并取值                
Dim btTemp As Byte
遍历所有session并取值                
str.ReadInt32()
遍历所有session并取值                
For k As Integer = 0 To iCount - 1
遍历所有session并取值                    sTemp 
= str.ReadString
遍历所有session并取值                    obj 
= altSerialization.ReadValueFromStream(str)
遍历所有session并取值                    
If (sTemp = "UserName" AndAlso _onlineUserList.BinarySearch(obj) < 0Then
遍历所有session并取值                        _onlineUserList.Add(
DirectCast(obj, String))
遍历所有session并取值                        
Exit For
遍历所有session并取值                    
End If
遍历所有session并取值                
Next
遍历所有session并取值            
Next
遍历所有session并取值            
str.Close()
遍历所有session并取值            st.Close()
遍历所有session并取值            _onlineUserUpdateTime 
= Now
遍历所有session并取值        
End If
遍历所有session并取值        
Return _onlineUserList
遍历所有session并取值    
End Function


关于设置:
我使用的是信任连接,在XP下就是aspnet用户,ASPState数据库就是它的,所以访问数据库的权限上没有问题。session存放在sql server中要使用持久的那种,如果是存放在tempDb中的,一重启机器后,权限就要重新设置,很苦恼。

相关文章: