C# 关于global.asax和那里的活动

C# 关于global.asax和那里的活动,c#,asp.net,sql,C#,Asp.net,Sql,所以我想了解的是整个global.asax事件。 我正在做一个简单的计数器,记录网站访问。我正在使用MSSQL 基本上我有两个整数。 totalNumberOfUsers-从一开始的总访问者。 currentNumberOfUsers—当前查看站点的用户总数 因此,我对global.asax事件的理解是,每次有人访问站点时,“Session_Start”都会被触发一次。所以每个用户一次。 “应用程序启动”仅在第一次有人访问该站点时触发 在这里我有我的global.asax文件 <scrip

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

基本上我有两个整数。 totalNumberOfUsers-从一开始的总访问者。 currentNumberOfUsers—当前查看站点的用户总数

因此,我对global.asax事件的理解是,每次有人访问站点时,“Session_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>
因此,如果我理解正确,每次有人来到这个网站,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");

如果您想记录一个站点的点击次数,为什么不在每次点击Session\u 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();
}

这可能是最简单的方法…

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

一种可能是将SessionID和最后一次访问的时间存储在数据库中。每次用户加载页面时,上次访问时间都设置为当前时间。要获取联机用户的数量,可以编写一个select,返回行的数量,其中LastAccessTime>DateTime.Now.AddMinutes(-10)


这里已经提出了其他建议:

假设您使用的是标准的Asp.net成员资格提供程序,您将能够使用它


如果您希望实现自定义解决方案,您可能希望创建自定义成员资格提供程序,并了解Microsoft如何实现它。它是基于大于当前日期的所有用户的计数减去

,这将给出用户总数。当前用户查看站点的情况如何,如正在运行的会话数。我会使用应用程序设置吗?
public void Page_Load(object sender, EventArgs e)  
{
    string Sql = "SELECT TotalVisits FROM tbl_Visit";

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