1. ホーム
  2. ASP.NET

ASP.NETのオンライン統計とアプリケーションとセッションを使用した訪問履歴

2022-02-20 05:10:39

          まず、ASP.NETのApplicationとSessionについて簡単に説明します。

          次の図は、非常に身近なWebアプリケーションの構造を示しています。

       この図では、Webサーバー上で動作するWebアプリケーションを「アプリケーション」と呼び、各クライアントとWebサーバーの間に確立される接続を「セッション」と考えることができます。アプリケーションと、各オンラインユーザーが確立する接続は、セッションに相当します。

       アプリケーションは共有され、グローバル変数に相当し、セッションは共有されず、各クライアント(ブラウザ)にプライベートであることは容易に理解できる。

       そこで、上の図では、ApplicationとSessionを次のように使っています。

<スパン アプリケーション

        共通の属性

<テーブル       属性     説明 すべて   すべての Application オブジェクト変数をオブジェクトの配列で返します。 すべてのキー   Application オブジェクトの全変数を文字列配列で返します。 カウント   アプリケーション内のオブジェクト変数の数を返します。

        共通のメソッドです。    

<テーブル   メソッド  説明 追加   アプリケーション変数の値を新規に追加します クリア   アプリケーション変数の値をすべて消去する 取得   変数名で引き渡された変数の値 設定   アプリケーション変数の値を更新する ロック   アプリケーションの全変数の値をロックする ロック解除   アプリケーションの変数値のロックを解除する

セッション

        共通の属性です。

<テーブル           属性         説明 カウント    セッションステートコレクションに含まれるSessionオブジェクトの数を取得します。 内容   現在のセッション状態オブジェクトへの参照を取得する キー   セッションに保存されているすべての値のセットを取得する セッションID   セッションを識別するために使用される一意のセッションIDを取得します。 タイムアウト    セッション・ステータス・プロバイダがセッションを終了するまでの許容タイムアウト時間を取得または設定します。 モード   現在のセッションの状態モードを取得します


        一般的な方法です。

<テーブル     メソッド     説明 追加   新しいSessionオブジェクトを追加する クリア   セッション状態にあるすべての値を消去する コピー先   セッション状態の値を一次元の富島配列に設定する 削除する   セッションステータスコレクションから項目を削除する すべて削除   すべてのセッション状態の値をクリアする

        ASP.NETでオンラインの人数や過去の訪問者数をカウントするには、さらにApplication_Start()イベント、Application_End()イベント、Session_Start()イベント、Session_End()イベントの4つが必要です。

       プログラムが起動すると、まず Global.asax.cs ファイル内の Application の Application_Start() イベントが発生し、このイベントに 2 つの Application 変数値 (Application の変数値なので、プログラム全体の "public variable" と同等): totalCount ( 訪問回数の総数を示す)、 onlineCount ( 現在オンラインの人数を示す): を追加する必要があるのです。        

protected void Application_Start()
        {
            string strConn = "server=192.168.24.123;database=database name;uid=sa;pwd=123456;"; //database connection string
            SqlConnection conn = new SqlConnection(strConn); //Instantiate the database connection object
            conn.Open(); //open the database connection
            string cmdText = "select count from Count"; //define the query string
            SqlCommand cmd = new SqlCommand(cmdText, conn); //Instantiate the command object
            int count = (int)cmd.ExecuteScalar(); //take out the history of the number of visitors in the database

            Application["total"] = count; //define the Application variable value total and assign it to the number of historical visits
            Application["onLine"] = 0; //define the Application variable value onLine and assign it to 0
        }

       以下は、Session_Start()イベントのコードを書くことで、各クライアント(ブラウザ)がサーバーにアクセスすると、Session_Start()イベントが発生し、このことは、quot;パブリック変数"をさせることです。totalCountとonlineCountは自己インクリメント1、この時 複数のクライアントが同時にアクセスする場合、エラーが発生する可能性があるので、まずApplicationのLock()メソッドでApplicationの変数をロックし(ApplicationがLock()を実行した後、サイト全体のApplicationに関する全ての操作はロックされて遅延、Application assignment, Application readなど)、1クライアントだけがこの2変数を自己インクリメントでき、後で他のクライアントの操作のためにロックを解除できるようにする必要があります。      

protected void Session_Start()
        {
            Application.Lock(); //lock Application
            Application["total"] = (int)Application["total"] + 1; //add 1 to the total number of visits
            Application["onLine"] = (int)Application["onLine"] + 1; // add 1 to the number of people online
            Application.UnLock(); //unlock
        }


        これでオンライン人数と過去の訪問回数がカウントされたので、表示する必要があるときはApplication["variableValue"を直接呼び出すことができます。例えばLabelというコントロールにオンライン人数を表示するには、Label.Text=Application["onLine"]とするだけで、オンライン人数は表示されます。] ToString()でOK! 必要なもの 注意点 は、ApplicationとSessionに格納されている変数の値はobject型なので、直接値を代入することができますが、取り出すときは型を考慮する必要があります。

       クライアント(ブラウザ)がサーバーから切断する(このクライアントとサーバーの間のセッションを閉じる)とき、過去の訪問回数に変化がなく、オンライン人数を1だけ引く必要がある場合に、Session_End() イベントを発生させる。

protected void Session_End()
        {
            Application.Lock(); //lock Application
            Application["onLine"] = (int)Application["onLine"] - 1; //the total number of visits remains the same, the number of people online is reduced by 1
            Application.UnLock(); //unlock
        }

        テストを容易にするために、上記の例では、サーバーとの複数のセッションの確立に相当する複数のブラウザを介してコンピュータ上で開くことができ、おそらくあなたは、オンラインの人々の数は今10である場合、あなたがブラウザを閉じて、オンラインの人々の現在の数をテストするときに問題が見つかりますそのアプリケーション["オンライン;の値はまだ10です、とquotを実行しません;マイナス1&quotの操作。これは、SessionのTimeOutのデフォルト値が20分であるためです。つまり、デフォルトでは、ブラウザを閉じても、ブラウザとサーバー間の接続が切断されたことにはならず、20分待ってから切断されるのです。(この効果を試すには、TimeOutの値をもっと小さな値に設定することができます)

         最後に、サーバーをシャットダウンする場合は、現在アプリケーションに保存されている履歴アクセス数の合計をデータベースに再更新する必要があり、これは Application_End() イベントで実行される必要があります。

protected void Application_End()
        {
            string strConn = "server=192.168.24.123;database=database name;uid=sa;pwd=123456;"; //Define the database connection string
            SqlConnection conn = new SqlConnection(strConn); //Instantiate the database connection object
            conn.Open(); //open the database connection
            string cmdText = "update Count set count=@count"; //define the execution command
            SqlCommand cmd = new SqlCommand(cmdText, conn); //Instantiate the command object
            cmd.Parameters.Add(new SqlParameter("@count", Application["total"])); //assign a value to the parameter @count for the total number of accesses now
            cmd.ExecuteNonQuery(); //execute the command
            conn.Close(); //close the database
        }

       通常、ほとんどの人がプロセス全体を通して Application_End() イベントについて最も質問します。なぜなら、VisualStudio 上でテストを行うだけなら、システムを閉じても Application_End() イベントはトリガーされず、新しいデータがデータベースに書き込まれることもありません。では、どの時点で Application_End() が実際にトリガーされるのでしょうか?

        これを把握するためには、IISの例ですが、IISでプログラムを公開して実行した後、Application_End()イベントをトリガーにしてデータベースに最新の訪問履歴を書き込みたい場合、以下のようにIISでプログラムを終了して実行する必要があります。


備考 : Application_End() イベントは、アプリケーションがサーバー上で停止したときのみ発生し、再起動やパワーオフしたときには発生しません。

        オンライン人数や訪問履歴は小さな機能ですが、一通り調べて細かくまとめることで、勉強になり、頭の中の知識ネットワークが少し増えましたね 。