不该出现的Session丢失问题,是垃圾回收器干的吗?

topmonkey 2006-11-02 06:10:00
用户在WEB页面登录后,从数据库中取出用户信息,实例化成为一个MyUser对象,保存在Session中,为了防止Session丢失,在页面主框架中用异步XMLHttp每隔30秒发出一次请求,被请求的页面也不做什么其他工作,仅仅是从Session中把MyUser对象读取出来,并重新设置一下Session.Timeout,让其等于60分钟(足够多了吧),但是在实际运行中,Session还是有时会出现丢失的情况(其值变成null了),有时是半个小时,有时是一两个小时,有时一两天都不丢。
因为我在Session里面保存的不是一个字符串或数值,而是一个对象(就是刚才提到的MyUser对象),所以我很担心是不是被垃圾回收器给收走了,所以我想弄清楚是不是这个原因,按理说,内存中的某个对象如果有被引用,应该是不会被收回的吧?


环境:Win2003 + SqlServer2005 + ASP.NetV2.0
会话模式:InProc

//App_Code文件MyUser.cs:
using System;
using System.Data;
using System.Collections;
using MyProject.DataOperator;
namespace MyProject.MyUser
{
/// <summary>
/// 用户类
/// </summary>
public class MyUser
{
protected int _UserID = 0;
public int UserID
{
get { return _Usr_ID; }
}
protected string _ChineseName = 0;
public string ChineseName
{
get { return _ChineseName; }
set { _ChineseName = value; }
}
//.........省略
}
}



//这个是主框架页面Index.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Index.aspx.cs" Inherits="Program_Index" %>
<html xmlns:uct>
<head>
<title> Test系统 </title>
</head>
<body>
主页面内容

<script type="text/javascript" language="javascript">
// <!CDATA[
//建立XMLHttpRequest对象
if(window.ActiveXObject && !window.XMLHttpRequest){
window.XMLHttpRequest = function(){
var MSXML = ["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
for(var i=0; i<MSXML.length; i++){
try{ return new ActiveXObject(MSXML[i]); }
catch(e){}
}
return null;
};
}

//刷新服务器的Session
function refurbishServer(){
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("post", "Refurbish.aspx", false);
xmlhttp.send();
var result = xmlhttp.responseText;
if(result == "Session Lost"){
alert("登录超时!请重新登录。");
//重新登录操作。。。。
}
}

//每30秒刷一次
setInterval('refurbishServer()',30000);
// ]]>
</script>
</body>
</html>



//刷新服务器的Session时调用的文件Refurbish.aspx的代码页文件Refurbish.aspx.cs:
using System;
using System.Web;
using MyProject.UserManager;
public partial class Program_Refurbish : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Expires = 0;
string userName = "";
if (Session["LoginedUser"] != null)
{
Session.Timeout = 60;
MyUser u = (MyUser)Session["LoginedUser"];
userName = u.ChineseName;
Response.Write(userName);
}
else
Response.Write("Session Lost");
Response.End();
}
}

...全文
274 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hero4u 2006-11-07
  • 打赏
  • 举报
回复
呵呵,生存周期太短了
眼里进了砂 2006-11-07
  • 打赏
  • 举报
回复
Session本身的时间就不是准确的,没办法
topmonkey 2006-11-07
  • 打赏
  • 举报
回复
看来没有什么实质上的解答,算了,结贴吧。
hegang888888888 2006-11-03
  • 打赏
  • 举报
回复
可能是进程重起了
leaohong 2006-11-03
  • 打赏
  • 举报
回复
到期了吧
pfc001 2006-11-02
  • 打赏
  • 举报
回复
不是GC造成的
liushui1981 2006-11-02
  • 打赏
  • 举报
回复
自己到期,进程重启动都可能!
levin9 2006-11-02
  • 打赏
  • 举报
回复
up,应该不是垃圾回收器的问题.
bighead 2006-11-02
  • 打赏
  • 举报
回复
InProc的Session是不可靠的,如果不怕性能差就用StateServer或者干脆数据库.

最好的办法是用要放在Session里,放在Cache里吧.
qltouming 2006-11-02
  • 打赏
  • 举报
回复
听讲
shalen520 2006-11-02
  • 打赏
  • 举报
回复
浏览器端通过脚本每30秒自动访问一次IIS端,这样进程也会被回收?
=============================================================

进程会在特定的情况下被回收,比如内存不足,web.config被改动,这时inproc 模式下的session就会丢失,你最好看一下事件日志,看是否是这种情况
topmonkey 2006-11-02
  • 打赏
  • 举报
回复
应该是进程被回收,应用程序重启导致的
--------------------------------
浏览器端通过脚本每30秒自动访问一次IIS端,这样进程也会被回收?
shalen520 2006-11-02
  • 打赏
  • 举报
回复
应该是进程被回收,应用程序重启导致的
scow 2006-11-02
  • 打赏
  • 举报
回复
session丢失的原因可能很多,但决不可能是gc,
sf,等楼下的解释

62,041

社区成员

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

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

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

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