关于global.asax和那里的事件

时间:2010-03-22 09:53:38

标签: c# asp.net sql

所以我想要了解的是整个global.asax事件。 我做了一个记录网站访问的简单计数器。我正在使用MSSQL。

基本上我有两个整数。 totalNumberOfUsers - 从开始的总visist。 currentNumberOfUsers - 此刻查看网站的用户总数。

所以我理解global.asax事件的方式是每次有人来到网站时“Session_Start”被触发一次。所以每个用户一次。 “Application_Start”仅在有人第一次访问该网站时触发。

继续这个我在这里有我的global.asax文件。

<script runat="server">

    string connectionstring = ConfigurationManager.ConnectionStrings["ConnectionString1"].ConnectionString;

    void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup

        Application.Lock();
        Application["currentNumberOfUsers"] = 0;
        Application.UnLock();

        string sql = "Select c_hit from v_counter where (id=1)";
        SqlConnection connect = new SqlConnection(connectionstring);
        SqlCommand cmd = new SqlCommand(sql, connect);

        cmd.Connection.Open();

        cmd.ExecuteNonQuery();

        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            Application.Lock();
            Application["totalNumberOfUsers"] =  reader.GetInt32(0);
            Application.UnLock();
        }

        reader.Close();
        cmd.Connection.Close();

    }

    void Application_End(object sender, EventArgs e) 
    {
        //  Code that runs on application shutdown

    }

    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs

    }

    void Session_Start(object sender, EventArgs e) 
    {
        // Code that runs when a new session is started

        Application.Lock();
        Application["totalNumberOfUsers"] = (int)Application["totalNumberOfUsers"] + 1;
        Application["currentNumberOfUsers"] = (int)Application["currentNumberOfUsers"] + 1;
        Application.UnLock();

        string sql = "UPDATE v_counter SET c_hit = @hit WHERE c_type = 'totalNumberOfUsers'";

        SqlConnection connect = new SqlConnection(connectionstring);
        SqlCommand cmd = new SqlCommand(sql, connect);

        SqlParameter hit = new SqlParameter("@hit", SqlDbType.Int);
        hit.Value = Application["totalNumberOfUsers"];
        cmd.Parameters.Add(hit);

        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
        cmd.Connection.Close();

    }

    void Session_End(object sender, EventArgs e) 
    {
        // Code that runs when a session ends. 
        // Note: The Session_End event is raised only when the sessionstate mode
        // is set to InProc in the Web.config file. If session mode is set to StateServer 
        // or SQLServer, the event is not raised.

        Application.Lock();
        Application["currentNumberOfUsers"] = (int)Application["currentNumberOfUsers"] - 1;
        Application.UnLock();
    }




</script>

在page_load中我有这个

protected void Page_Load(object sender, EventArgs e)
{
    l_current.Text = Application["currentNumberOfUsers"].ToString();
    l_total.Text = Application["totalNumberOfUsers"].ToString();
}

所以,如果我理解这一点,每当有人来到网站时,currentNumberOfUsers和totalNumberOfUsers都会以1递增。但是当会话结束时,currentNumberOfUsers将减1。

如果我使用同一台计算机访问具有3种类型浏览器的网站,我应该在两个计数器上点击3次。在数小时后再次这样做我应该有3个当前和6个,对吗?

现在它的工作方式是当前上升到2,并且在IE和Chrome上的每次回发中总数增加,但在Firefox上没有。

最后一件事,这是一回事吗?

Application["value"] = 0;
value = Application["value"]

//OR

Application.Set("Value", 0);
Value = Application.Get("Value");

3 个答案:

答案 0 :(得分:1)

假设您使用的是标准的Asp.net会员提供商,您将能够使用membershipProvider.GetNumberOfUsersOnline

如果您正在寻求实施自定义解决方案,您可能需要创建自定义MembershipProvider并遵循Microsoft实施它的方式。它基于LastActivityDate大于当前日期减去UserIsOnlineTimeWindow的所有用户的数量

答案 1 :(得分:0)

如果要记录网站上的点击次数,为什么不在每次点击Session_Start时只增加数据库中的列?

然后,当您想要显示有多少人访问过您的网站时,只需从该列中执行SQL Select语句?像这样......

void Session_Start(object sender, EventArgs e)
{
    string Sql = "UPDATE tbl_Visit SET TotalVisits=(TotalVisits+1)";
    // execute sql here
}

然后当你想要显示它时:

public void Page_Load(object sender, EventArgs e)  
{
    string Sql = "SELECT TotalVisits FROM tbl_Visit";

    lit_total_visits.Text = DataReader["TotalVisits"].ToString();
}

可能是最简单的方法......

答案 2 :(得分:0)

您无法直接跟踪您网站上当前有多少用户。 global.asax具有Session_End事件,该事件在会话超时或手动强制Session.Abandon之后触发。但你不能真正依赖被解雇的事件。

可能的方法是将SessionID和上次访问的时间存储在数据库中。每次用户加载页面时,最后一次访问时间都设置为当前时间。要获得在线用户数量,您可以编写一个返回行数的选项,其中LastAccessTime&gt; DateTime.Now.AddMinutes(-10)

此处已提出其他建议:Best way to keep track of current online users