<%@ 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>