/// <summary> /// 关闭。 /// </summary> /// <remarks>关闭。</remarks> private void Close() { //锁定会话传输通道列表。 lock (this.SyncRoot) { //声明创建会话传输通道键列表。 List <Guid> keys = new List <Guid>(); //遍历会话传输通道键列表。 foreach (Guid item in this.list.Keys) { //将会话传输通道键添加入列表中。 keys.Add(item); } //遍历全部会话传输通道键。 foreach (Guid item in keys) { //验证会话传输通道是否存在。 if (this.list.ContainsKey(item)) { //获取要删除的会话传输通道对象。 SessionTransferChannel channel = this.list[item]; try { //从会话传输通道列表中删除。 this.list.Remove(item); } finally { //释放会话传输通道资源。 channel.Dispose(); } } } } }
/// <summary> /// 删除会话传输通道。 /// </summary> /// <remarks>删除会话传输通道。</remarks> internal void Remove(Guid key) { //验证要删除的会话传输通道键是否有效。 if (key == Guid.Empty) { return; } //创建线程删除会话传输通道。 new Thread(new ParameterizedThreadStart(delegate(object obj) { //要删除的会话传输通道键。 Guid k = (Guid)obj; //锁定同步。 lock (this.SyncRoot) { //验证会话传输通道是否存在。 if (this.list.ContainsKey(k)) { //获取要删除的会话传输通道对象。 SessionTransferChannel channel = this.list[k]; try { //从会话传输通道列表中删除。 this.list.Remove(k); } finally { //释放会话传输通道资源。 channel.Dispose(); } } } //启动线程。 })).Start(key); }
/// <summary> /// 获取会话传输通道。 /// </summary> /// <remarks>获取会话传输通道。</remarks> /// <returns>SessionsStore.SessionTransferChannel</returns> internal SessionTransferChannel GetChannel() { //重新开始等待可用的会话传输通道。 Restart: //锁定会话传输通道列表。 lock (this.SyncRoot) { //验证释放有可用未被锁定的会话传输通道。 if (this.list.Count > this.LockCount()) { //遍历全部会话传输通道对象。 foreach (SessionTransferChannel item in this.list.Values) { //锁定会话传输通道。 if (item.Lock()) { Debug.WriteLine("找到可以用的通道获取它[Key:" + item.Key.ToString() + "]", "SessionTransferChannelManager.GetChannel"); //得到被有效锁定的会话传输通道。 return(item); } } } } //验证是否有最大会话传输通道限制。 if (this.Owner.MaxSessionTransferChannel > 0) { //声明会话传输通道数量。 int n = this.Count; //验证会话传输通道是否已经在最大数量。 if (n >= this.Owner.MaxSessionTransferChannel) { //会话传输通道已经在最大数量不允许再创建新的会话传输通道。 goto Restart; } } //创建新的会话传输通道。 SessionTransferChannel channel = null; try { //新建会话传输通道对象。 channel = this.CreateChannel(); //连接到会话中心。 channel.Connection(); //锁定会话传输通道对象。 channel.Lock(); //将新建的会话传输通道添加到会话传输通道列表中。 this.list.Add(channel.Key, channel); } catch (Exception e) { //验证通道对象是否为空。 if (channel != null) { //在通道列表中删除当前通道。 if (this.list.ContainsKey(channel.Key)) { this.list.Remove(channel.Key); } //是否通道资源。 try { channel.Dispose(); } finally { channel = null; } } throw e; } return(channel); }
/// <summary> /// 连接到全局会话中心。 /// </summary> /// <remarks>连接到全局会话中心。</remarks> internal void Connection() { //锁定会话传输通道管理对象。 lock (this.SyncRoot) { //声明会话传输通道。 SessionTransferChannel channel = null; try { //创建会话传输通道。 channel = this.CreateChannel(); //锁定通道。 lock (channel.SyncRoot) { //锁定。 channel.Lock(); //连接到全局会话中心。 channel.Connection(); //将会话传输通道添加入列表中。 this.list.Add(channel.Key, channel); //发送初始化指令。 channel.Write(new object[] { (byte)SessionStoreCommandHeader.Initialize, (byte)SessionTransferNodeTypes.ASP_NET_FORM }); //初始化会话传输字符编码。 #if DEBUG byte ed = channel.Reader.ReadByte(); Debug.WriteLine("Connection[CharacterEncoding:" + ed.ToString() + "]", "SessionTransferChannelManager"); switch ((CharacterEncoding)ed) #else switch ((CharacterEncoding)channel.Reader.ReadByte()) #endif { case CharacterEncoding.UTF8Encoding: this.Owner.Encoding = System.Text.Encoding.UTF8; break; case CharacterEncoding.UTF7Encoding: this.Owner.Encoding = System.Text.Encoding.UTF7; break; case CharacterEncoding.UTF32Encoding: this.Owner.Encoding = System.Text.Encoding.UTF32; break; case CharacterEncoding.UnicodeEncoding: this.Owner.Encoding = System.Text.Encoding.Unicode; break; case CharacterEncoding.ASCIIEncoding: this.Owner.Encoding = System.Text.Encoding.ASCII; break; case CharacterEncoding.BigEndianUnicode: this.Owner.Encoding = System.Text.Encoding.BigEndianUnicode; break; } //初始化获取全局会话中心当前时间。 this.Owner.SessionCenterCurrentDateTime = channel.ReadDateTime(); Debug.WriteLine("Connection[SessionCenterCurrentDateTime:" + this.Owner.SessionCenterCurrentDateTime.ToString() + "]", "SessionTransferChannelManager"); //初始化获取全局会话中心通道最大限制。 int MaxSessionTransferChannel = channel.Reader.ReadInt32(); if (MaxSessionTransferChannel > 0) { this.Owner.MaxSessionTransferChannel = MaxSessionTransferChannel; } Debug.WriteLine("Connection[MaxSessionTransferChannel:" + this.Owner.MaxSessionTransferChannel.ToString() + "]", "SessionTransferChannelManager"); //发送安全连接内容。 if (string.IsNullOrEmpty(this.Owner.SessionCenterSecureConnectionContent)) { channel.Writer.Write((int)0); Debug.WriteLine("Connection[SessionCenterSecureConnectionContent:" + (this.Owner.SessionCenterSecureConnectionContent == null ? "null" : this.Owner.SessionCenterSecureConnectionContent) + "]", "SessionTransferChannelManager"); } else { byte[] bytes = new byte[this.Owner.Encoding.GetByteCount(this.Owner.SessionCenterSecureConnectionContent)]; Buffer.BlockCopy(BitConverter.GetBytes(bytes.Length), 0, bytes, 0, TypeLengthConstant.IntLength); Buffer.BlockCopy(this.Owner.Encoding.GetBytes(this.Owner.SessionCenterSecureConnectionContent), 0, bytes, TypeLengthConstant.IntLength, bytes.Length); channel.Writer.Write(bytes); Debug.WriteLine("Connection[SessionCenterSecureConnectionContent:" + this.Owner.SessionCenterSecureConnectionContent + "]", "SessionTransferChannelManager"); } //验证安全连接是否通过。 #if DEBUG if (channel.Reader.ReadBoolean()) { Debug.WriteLine("Connection[安全连接验证通过]", "SessionTransferChannelManager"); } else { Debug.WriteLine("Connection[安全连接验证不通过]", "SessionTransferChannelManager"); throw new Exception("安全连接验证不通过!"); } #else if (!channel.Reader.ReadBoolean()) { throw new Exception("安全连接验证不通过!"); } #endif } } catch (Exception e) { Debug.WriteLine("Connection[e:" + e.ToString() + "]", "SessionTransferChannelManager"); //验证通道对象是否为空。 if (channel != null) { //在通道列表中删除当前通道。 if (this.list.ContainsKey(channel.Key)) { this.list.Remove(channel.Key); } //是否通道资源。 try { channel.Dispose(); } finally { channel = null; } } throw e; } finally { //解锁。 if (channel != null) { channel.UnLock(); } } } }