不该出现的Session丢失问题,是垃圾回收器干的吗?
用户在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();
}
}