Also was ich versuche zu verstehen, ist die ganze global.asax Ereignisse. Ich mache einen einfachen Zähler, der Website-Besuche aufzeichnet. Ich bin mit MSSQL.
Im Grunde habe ich zwei Ints. totalNumberOfUsers - Die Gesamtzahl der Besucher von Anfang an. currentNumberOfUsers - Die Gesamtzahl der Benutzer, die die Seite im Moment besuchen.
Also die Art, wie ich global.asax Ereignisse verstehen, ist, dass jedes Mal, wenn jemand auf die Website kommt "Session_Start" einmal ausgelöst wird. Also einmal pro Benutzer. "Application_Start" wird nur einmal abgefeuert, wenn jemand das erste Mal auf die Website kommt.
Passend dazu habe ich hier meine global.asax-Datei.
<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>
In der page_load habe ich dies
protected void Page_Load(object sender, EventArgs e)
{
l_current.Text = Application["currentNumberOfUsers"].ToString();
l_total.Text = Application["totalNumberOfUsers"].ToString();
}
Also, wenn ich das richtig verstehe, jedes Mal, wenn jemand auf die Website sowohl die currentNumberOfUsers und totalNumberOfUsers kommt, werden mit 1 erhöht. Aber wenn die Sitzung vorbei ist, wird die currentNumberOfUsers mit 1 dekrementiert.
Wenn ich die Website mit 3 verschiedenen Browsern und demselben Computer aufrufe, sollte ich auf beiden Zählern 3 Treffer haben. Wenn ich das nach einigen Stunden noch einmal mache, sollte ich 3 aktuelle und 6 insgesamt haben, richtig?
Die Art und Weise seine Arbeit im Moment ist die aktuelle geht bis zu 2 und die Summe wird bei jedem Postback auf IE und Chrome, aber nicht auf Firefox erhöht.
Und eine letzte Frage: Ist das dasselbe?
Application["value"] = 0;
value = Application["value"]
//OR
Application.Set("Value", 0);
Value = Application.Get("Value");