最近在做腾讯QQ登录,想使用memcache保存用户信息,以实现记住登录功能。
在同一台服务器上有二个.net应用程序A和B,同时还安装有一个memcached服务,版本是1.26。
A应用和B应用都是采用ado.net + MVC5。A应用为passport.xxx.com,B应用为blog.xxx.com.
A应用就是一个登录QQ功能,用来实现QQ登录并将登录信息写入memcache和cookie.
现在遇到问题:
1、在A应用已经实现了所有的登录功能,登录、记住登录状态等己实现。
2、而B应用需要共享A应用的用户登录信息,所以用户在A应用登录成功时将用户的openid存入了cookie。
3、B应用己正常获取到A应用的cookie。但是B应用在使用此cookie从memcache中获取数据时为null。
4、使用telnet客户端连接memcache服务器,可以正常获取数据。
已经排过的错:
A应用写入的key和B就用获取的key一致。
缓存没有过期。
telnet可以获取数据。
在各自的应用内,memcache服务功能全部正常。
最后的问题就是:
A应用写入的缓存在B应用获取不到。
附上主要代码:
这是B应用的OnActionExecuting
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
//1.先检查用户的cookie是否包含登录信息,cookie的值即是qq用户的openid
//2.根据用户cookie去服务器检索
//3.如果用户cookie跟服务器上一致,则表明己登录。
if (Request.Cookies["user_qq_cookie"] != null)
{
//有cookie,表明己登录过了
//1)先取cookie,这里获取的cookie即为A应用写入的cookie,可以正常获取
string user_qq_cookie = Request.Cookies["user_qq_cookie"].Value;
//2)根据cookie到服务器缓存中取数据。
//现在就是发现这里CacheHelper.Get获取不到数据。
object obj = CacheHelper.Get("qq_" + user_qq_cookie);
//3)
if (obj != null)//说明服务器中有这个缓存
{
//这里的user为一个实体对象
user = (Passport_OAuth_User_Model)obj;
ViewBag.user = user;
}
else
{
//程序直接走到这
user = null;
}
}
else
{
//没有cookie
user = null;
}
base.OnActionExecuting(filterContext);
}
View Code
下面是CacheHelper的代码:
private static readonly MemcachedClient memcachedClient;
static MemCachedHelper()
{
if(string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["memcachedServer"]))
{
throw new Exception("请在web.config的appsetting中配置memcached服务器信息!");
}
string[] servers = ConfigurationManager.AppSettings["memcachedServer"].Split(new char[','], StringSplitOptions.RemoveEmptyEntries);
//初始化池
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(servers);
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover = true;
pool.Nagle = false;
pool.Initialize();
memcachedClient = new Memcached.ClientLibrary.MemcachedClient();
memcachedClient.EnableCompression = false;
}
public object Get(string key)
{
return memcachedClient.Get(key);
}
public void Set(string key, object objObject)
{
memcachedClient.Set(key, objObject);
}
View Code
web.config中的代码:
<add key ="memcachedServer" value="127.0.0.1:11211"/>
其中A应用和B应用都是用的这个CacheHelper代码。
实在是找不到方法了,故来博客园相求,请各位大神不吝赐教。