asp.net 中根据sessionid 获取或删除session

本文探讨了微信公众号中用户会话的管理方法,包括如何使用openid查询并更新用户信息到缓存,以及如何在用户取消关注时清除缓存中的会话数据。通过反射调用微软公开源码中的方法,实现更精细化的会话控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做微信公众号,经理提出当用户关注公众号后并绑定则把用户的绑定信息写到表中,如果取消关注从表中把用户信息删除。一开始感觉很简单,微信推送给服务器的事件中包含有用户的openid。用openid查询用户信息后,再写到表中就行。用户绑定登录后,需要将用户信息放到缓存中,这样用户就不用每次都登录。问题来了,用户取消关注后,再次访问上一个页面还有以前的用户信息,又不能贸然清空缓存。后来查看微软已公开的源码,发现有根据id清除缓存的方法,不过需要反射调用。

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Reflection;

using System.Web.SessionState;

using System.Threading;

using System.Collections.Concurrent;

 

namespace TestProject.TestCode

{

 

    public static class SessionHelper

    {

 

        private readonly static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();

 

        #region  ConcurrentDictionary

 

        private static bool _initialize;

        private static ConcurrentDictionary<string, string> _dic = null;

        private static object _lock = new object();

 

        private static ConcurrentDictionary<string, string> sessionDic

        {

            get

            {

                return LazyInitializer.EnsureInitialized<ConcurrentDictionary<string, string>>(ref _dic, ref _initialize, ref _lock, () =>

                    new ConcurrentDictionary<string, string>());

            }

        }

 

        #endregion

 

 

        #region SessionStateStoreProviderBase

 

        private static bool _initializeStore;

        private static SessionStateStoreProviderBase _store;

        private static object _lockStore = new object();

 

        private static SessionStateStoreProviderBase SessionStore

        {

            get

            {

                return LazyInitializer.EnsureInitialized<SessionStateStoreProviderBase>(ref _store, ref _initializeStore, ref _lockStore, () =>

                {

                    IHttpModule module = HttpContext.Current.ApplicationInstance.Modules["Session"];

                    return module.GetType()

                         .GetField("_store", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(module) as SessionStateStoreProviderBase;

                });

            }

        }

 

        #endregion

 

        public static SessionStateStoreData GetSession(string id)

        {

            if (string.IsNullOrEmpty(id)) return null;

            if (SessionStore != null)

            {

                bool isLock = false;

                object lockId = new object();

                TimeSpan lockAge = TimeSpan.Zero;

                SessionStateActions state = SessionStateActions.InitializeItem;

                return SessionStore.GetItem(HttpContext.Current, id, out isLock, out lockAge, out lockId, out state);

            }

            return null;

        }

 

        public static void RemoveSession(string id)

        {

            if (SessionStore != null)

            {

                SessionStore.RemoveItem(HttpContext.Current, id, 0, null);

            }

        }

 

        public static string GetSessionId(string openId)

        {

            string sessionId = null;

            return sessionDic.TryGetValue(openId, out sessionId) ? sessionId : null;

        }

 

        public static bool AddOrUpdate(string openId)

        {

            string sessionId = null;

            if (HttpContext.Current.Session != null)

            {

                sessionId = HttpContext.Current.Session.SessionID;

            }

            if (string.IsNullOrEmpty(sessionId)) return false; ;

 

            return sessionDic.AddOrUpdate(openId, sessionId, (id, val) => val) == sessionId;

        }

 

    }

   

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值