<%@ Application Language="C#" %>
<script runat="server">
private static System.Threading.Timer timer;
private string updatetime = ConfigurationManager.ConnectionStrings["UpdateTime"].ConnectionString;
private string logintimeout = ConfigurationManager.ConnectionStrings["LoginTimeOut"].ConnectionString;
private int interval = 1000 * 60 * 5;//检查在线用户的间隔时间.默认为5分钟
private int SessionTimeOut = 5;
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
try
{
interval =1000*60* Convert.ToInt32(updatetime);
}
catch
{
interval = 1000 * 60 * 5;
}
try
{
SessionTimeOut = 1000 * 60 * Convert.ToInt32(logintimeout);
}
catch
{
SessionTimeOut = 5;
}
System.Data.DataTable userTable = new System.Data.DataTable("UserTable");
userTable.Columns.Add("SessionID");//用户SessionID
userTable.Columns.Add("PersonName");//用户名
userTable.Columns.Add("PersonDesc");//用户姓名
userTable.Columns.Add("FirstRequestTime");//第一次请求的时间
userTable.Columns.Add("ClientIP");//客户端IP
userTable.Columns.Add("LastRequestTime");//最近一次访问的时间
userTable.Columns.Add("ClientComputerName");//客户机器名
//userTable.Columns.Add("LastRequestPath");//最后访问的页面
userTable.PrimaryKey = new System.Data.DataColumn[] { userTable.Columns[1] };
userTable.AcceptChanges();
Application.Lock();
Application["UserOnLine"] = userTable;
Application.UnLock();
///
//OAShell.OAMedia oaMedia = new OAShell.OAMedia();
//oaMedia.DeleteDirectory( Server.MapPath(Request.ApplicationPath) + "//" + "Document");
//用于记录留言用用户
System.Data.DataTable messageUser = new System.Data.DataTable("MessagUser");
messageUser.Columns.Add("SessionID");//用户SessionID
messageUser.Columns.Add("UserName");//用户名
messageUser.Columns.Add("UserDesc");//用户姓名
messageUser.Columns.Add("FirstRequestTime");//第一次请求的时间
messageUser.Columns.Add("ClientIP");//客户端IP
messageUser.Columns.Add("LastRequestTime");//最近一次访问的时间
messageUser.Columns.Add("ClientComputerName");//客户机器名
//userTable.Columns.Add("LastRequestPath");//最后访问的页面
messageUser.PrimaryKey = new System.Data.DataColumn[] { messageUser.Columns["UserName"] };
messageUser.AcceptChanges();
Application.Lock();
Application["MessageUser"] = messageUser;
Application.UnLock();
if (timer == null)
timer = new System.Threading.Timer(new System.Threading.TimerCallback(ScheduledWorkCallback),
sender, 0, interval);
}
void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
//OAShell.OAMedia oaMedia = new OAShell.OAMedia();
//oaMedia.DeleteDirectory(Server.MapPath(Request.ApplicationPath) + "//" + "Document");
}
void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码
}
void Session_Start(object sender, EventArgs e)
{
// 在新会话启动时运行的代码
SessionTimeOut = Session.Timeout;
}
void Session_End(object sender, EventArgs e)
{
// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。
System.Data.DataTable userTable = (System.Data.DataTable)Application["UserOnLine"];
for (int i = userTable.Rows.Count - 1; i >= 0; i--)
{
if ((Session.SessionID != null) && (Session.SessionID == userTable.Rows[i]["SessionID"].ToString()))
{
userTable.Rows[i].Delete();
break;
}
}
userTable.AcceptChanges();
Application.Lock();
Application["UserOnLine"] = userTable;
Application.UnLock();
}
//定时清除过时的信息
private void ScheduledWorkCallback(object sender)
{
string filter = "Convert(LastRequestTime,'System.DateTime') < Convert('" + System.DateTime.Now.AddSeconds(-SessionTimeOut * 60).ToString() + "','System.DateTime')";
System.Data.DataTable userTable = (System.Data.DataTable)Application["UserOnLine"];
System.Data.DataRow[] lineOutUsers = userTable.Select(filter);
for (int i = 0; i < lineOutUsers.Length; i++)
{
System.Data.DataRow curRow = lineOutUsers[i];
//保存到数据库
curRow.Delete();
}
userTable.AcceptChanges();
Application.Lock();
Application["UserOnLine"] = userTable;
Application.UnLock();
//
//string filter = "Convert(LastRequestTime,'System.DateTime') < Convert('" + System.DateTime.Now.AddSeconds(-SessionTimeOut * 60).ToString() + "','System.DateTime')";
System.Data.DataTable messageUser = (System.Data.DataTable)Application["MessageUser"];
System.Data.DataRow[] messageUsers = messageUser.Select(filter);
for (int i = 0; i < messageUsers.Length; i++)
{
System.Data.DataRow curRow = messageUsers[i];
curRow.Delete();
}
messageUser.AcceptChanges();
Application.Lock();
Application["MessageUser"] = messageUser;
Application.UnLock();
}
</script>