2 Stimmen

Über global.asax und die dortigen Ereignisse

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");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X