想要在OA中添加一个在线人数统计功能,可是发现效果不对劲。
1.首先创建一个全局应用程序类Global.aspx,代码如下:
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
Application["counter"] = 0;
}
void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
}
void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码
}
void Session_Start(object sender, EventArgs e)
{
// 在新会话启动时运行的代码
//对application对象进行加锁,以防多个用户同时开启会话
Application.Lock();
Application["counter"] = (int)Application["counter"] + 1;
//解锁
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。
//对Application对象进行加锁,以防多个用户同时退出会话
Application.Lock();
Application["counter"] = (int)Application["counter"] - 1;
//解锁
Application.UnLock();
}
2.Web.config文件中做了以下配置:<sessionState mode="InProc" timeout="2" />
3.添加了一个登陆页面Login.aspx,登陆成功后跳转到Default.aspx页面,在Default.aspx页面中有一个Label(其中lblCount.Text=Application["counter"].ToString()),还有一个退出按钮,在该按钮事件下有如下代码:Session.Abandon(); Response.Redirect("~/Login.aspx");
另外当用户点击浏览器关闭按钮时写了一段Javascript代码:
window.onunload=function(){
$.ajax({
type: "GET",
url: "closeWindow.aspx"
});
}
利用JQuery,通过Ajax在用户关闭浏览器时向CloseWindow.aspx页面发送一个请求,在CloseWindow.aspx页面的Page_Load事件中写了一句代码:Session.Abandon();
感觉写的基本上没问题,在360里面是正确的,可是在IE8中却不对,麻烦哪位大侠帮忙看一下!!!
这个统计在线人数是不准确的。不过也没有绝对准确的方式。代码没有问题
session存在过期时间的问题。还有就是捕捉关闭IE的动作,你上边的问题可能在IE8中你没有捕捉到IE关闭的操作。调试一下看是否捕捉到那个关闭动作
用 ajax 相关技术,每隔一段时间检查一次,会较准确,但是较耗宽带的做法。
window.onunload=function(){
$.ajax({
type: "GET",
url: "closeWindow.aspx"
});
}
这里的回发写的应该有问题
window.onunload=function(){ $.get("closeWindow.aspx");}因为这里只做回发,不做返回值处理,所以上面的写法是会有问题的.
一般都是估计大概多少人在线。
维护一个登录人员的列表,包括登录标识、访问页面时间(每次请求都要更新)等。假设半个小时没有访问系统算不在线,然后再加上正常离线维护,以及关闭IE能获取到的离线。
这样可以稍微准确定,又不会像不断请求来维护在线的消耗服务器资源。