Gobal.asax中写一用Session记录信息用法

<%@ 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();

    }

    //定时清除过时的信息Gobal.asax中写一Session用记录信息用法

    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>

你可能感兴趣的:(timer,object,session,filter,application,sqlserver)