[玻璃鱼V]发布后的缓存问题

teita731 2010-07-12 11:45:55
先看代码:

//母版页

<body onload="StartHeartBeat();">

//HeartBeat.js

var HeartBeatTimer;

   function StartHeartBeat()
   {
   if (HeartBeatTimer == null)
HeartBeatTimer = setInterval("HeartBeat()", 1000 * 3);
   }
   function HeartBeat()
   {
   WebService.RunHeartBeat(runBeat,errorBeat);
   }
   function runBeat(result)
   {
   if(result==false)
   {
   location.href="/Manager/Login.aspx";
   }
   }
   function errorBeat(error)
   {
   alert(error.get_message());
   }

//WebService.cs

[WebMethod(EnableSession = true)]
public bool RunHeartBeat()
{
HeartBeat hb = new HeartBeat();
return hb.RunHeartBeat();
}

//HeartBeat.cs

public bool RunHeartBeat()
{
string CurrentUser = FutaRiWeb.Common.CacheHelper.GetCacheString("currentUser");
string userName = FutaRiWeb.Common.CacheHelper.GetSessionString("currentAdmin");

if (CurrentUser == "" || userName == "" || !CurrentUser.Equals(userName))
{
return false;
}
else
{
FutaRiWeb.Common.CacheHelper.SetCache("currentUser", CurrentUser);
FutaRiWeb.Common.CacheHelper.SetSession("currentAdmin",userName);
return true;
}
}

//CacheHelper.cs

public static bool SetCache(string CacheCode,string CacheObject)
{
try
{
System.Web.HttpContext.Current.Cache.Insert(CacheCode, CacheObject, null, DateTime.MaxValue, TimeSpan.FromMinutes(3), System.Web.Caching.CacheItemPriority.NotRemovable, null);
return true;
}
catch
{
return false;
}
}

-----------------------------------我是分割线-----------------------------------------

这是我写的一个单点登录,在本地测试的时候,一切正常,但是传到空间上后,发现登录过后一会就跳回到登录页。

我将HeartBeat.js中的runBeat(result)修改为,if(result==true){alert("true!")}else{alert("false!")}则在服务器上,提示数个true后就一直提示false(JS设置每3秒弹一个确认框)。

如此确认了不是JS心跳的问题(能正常执行心跳并取得WebService的返回值),问题应该出在Cache提前过期和无法重新设置Cache上。

大家给看看,问题出在哪里?
...全文
395 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
teita731 2010-07-22
  • 打赏
  • 举报
回复
算了,不打算纠结于这个问题了。

有机会换个空间看看是不是空间的问题。
teita731 2010-07-18
  • 打赏
  • 举报
回复
if (!IsLogin(admin))
{
if (FutaRiWeb.Common.CacheHelper.SetSession("currentAdmin",admin.Admin_Name_S.ToString()) && FutaRiWeb.Common.CacheHelper.SetSession("currentUser",admin.Admin_Name_S.ToString()))
{
....

这一句应该算是设置了Session和Cache了。

最近有点忙,实在抽不出时间搞这个,不过单独写在一个ASPX貌似我试过,也是提前过期。
teita731 2010-07-16
  • 打赏
  • 举报
回复
将代码简化到最简单的程度,依然有如此问题,我在想会不会是服务器的问题,可惜囊中羞涩,没办法重新买个空间来进行验证。

也联系过空间商的技术人员,反映问题后他们说服务器没问题-,-
teita731 2010-07-16
  • 打赏
  • 举报
回复
在登录成功的时候就已经设置了Cache和Session了,登录过程如下:

if (!IsLogin(admin))
{
if (FutaRiWeb.Common.CacheHelper.SetSession("currentAdmin",admin.Admin_Name_S.ToString()) && FutaRiWeb.Common.CacheHelper.SetSession("currentUser",admin.Admin_Name_S.ToString()))
{
FutaRiWeb.Common.DialogHelper.JSDialog("LoginSuccess", FutaRiWeb.Web.MyMessage.GetMessage(FutaRiWeb.Web.MyMessage.OBJOPSUCCESS, "登录"), "/Manager/Website/Setting/Default.aspx");
}
else
{
FutaRiWeb.Common.DialogHelper.JSDialog("LoginFailed", FutaRiWeb.Web.MyMessage.GetMessage(FutaRiWeb.Web.MyMessage.OBJOPFAILED, "登录"), "/Manager/Login.aspx");
}
}
else
{
FutaRiWeb.Common.DialogHelper.JSDialog("AdminIsExists", FutaRiWeb.Web.MyMessage.GetMessage(FutaRiWeb.Web.MyMessage.OBJISEXISTS, "用户"));
}
a365477312 2010-07-16
  • 打赏
  • 举报
回复
呀呀!全不懂!study
阿非 2010-07-16
  • 打赏
  • 举报
回复
登录的时候没看到 设置cache 的代码,可能你写了没贴。

你现在这个方法是写在webservice 中的吧,你把代码写在一个单独的.aspx or .ashx 中

然后在测试一下
阿非 2010-07-14
  • 打赏
  • 举报
回复
本地始终是好使,一到外网就不好用。

过一会就跳。

这个一会 你看下是多久,是否有3分钟。
阿非 2010-07-14
  • 打赏
  • 举报
回复
FutaRiWeb.Common.CacheHelper.GetCacheString("currentUser");

这个方法贴一下
teita731 2010-07-14
  • 打赏
  • 举报
回复
我在母版页中取消了心跳,使登录成功后直接跳到TEMP.ASP测试页中,通过BUTTON弹出对话框的形式获得CAHCE和SESSION值,在一定很短的时间后(大概十几秒到半分钟左右),同时失去Cache值和Session值。

然后我又取消了Cache的设置,只用Session,同样在TEMP.ASPX在一定很短的时间后(十几秒到半分钟之间),失去Session值。

检查web.config中,一开始并没有显式的对Session进行定义,然后我加上了
<sessionState mode="InProc" timeout="20"></sessionState>

问题依旧。
阿非 2010-07-14
  • 打赏
  • 举报
回复
方法也没看出什么问题。

在你调用 webservice的 RunHeartBeat() 方法前设置 Cache or Session 了么

我在想 为什么连3分钟没到就失效了

amandag 2010-07-14
  • 打赏
  • 举报
回复
如果不使用Cache,是否只是用Session也会提前过期?
teita731 2010-07-14
  • 打赏
  • 举报
回复
static public string GetCacheString(string strKey)
{
try
{
if (System.Web.HttpContext.Current.Cache[strKey] != null)
{
return System.Web.HttpContext.Current.Cache[strKey].ToString();
}
else
{
return "";
}
}
catch
{
return "";
}
}

static public string GetSessionString(string strKey)
{
try
{
if (System.Web.HttpContext.Current.Session[strKey] != null)
{
return System.Web.HttpContext.Current.Session[strKey].ToString();
}
else
{
return "";
}
}
catch
{
return "";
}
}
teita731 2010-07-13
  • 打赏
  • 举报
回复
回2楼,用户信息存在数据库里,登录的时候进行验证,验证通过后则通过缓存和心跳实行单点登录。

回3楼,具体应该怎么改呢?
jackyzsy2008 2010-07-13
  • 打赏
  • 举报
回复
你的Cache.Insert参数不对啊,

如果使用绝对过期,则 slidingExpiration 参数必须为 NoSlidingExpiration。

如果使用可调过期,则 absoluteExpiration 参数必须为 NoAbsoluteExpiration。

改一下再试试
teita731 2010-07-13
  • 打赏
  • 举报
回复
将SetCache改为绝对过期时间也是一样:

System.Web.HttpContext.Current.Cache.Insert(CacheCode, CacheObject, null, DateTime.Now.AddMinutes(Convert.ToDouble(3)), System.Web.Caching.Cache.NoSlidingExpiration);
teita731 2010-07-13
  • 打赏
  • 举报
回复
囧,根据6楼的方式修改以后,情况依旧啊-,-
gongsun 2010-07-13
  • 打赏
  • 举报
回复
在线登录用户的信息都放在缓存里 ???
阿非 2010-07-13
  • 打赏
  • 举报
回复
System.Web.HttpContext.Current.Cache.Insert(CacheCode, CacheObject, null, DateTime.MaxValue, TimeSpan.FromMinutes(3), System.Web.Caching.CacheItemPriority.NotRemovable, null);


=>


System.Web.HttpContext.Current.Cache.Insert(CacheCode, CacheObject, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(3));



teita731 2010-07-13
  • 打赏
  • 举报
回复
自己也顶个-,-

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧