ASP.NETのオンライン統計とアプリケーションとセッションを使用した訪問履歴
まず、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() イベントは、アプリケーションがサーバー上で停止したときのみ発生し、再起動やパワーオフしたときには発生しません。
オンライン人数や訪問履歴は小さな機能ですが、一通り調べて細かくまとめることで、勉強になり、頭の中の知識ネットワークが少し増えましたね 。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
.netcoreプロジェクトでIStartupFilterを使用するためのチュートリアル
-
NET6新機能 - 暗黙の名前空間参照
-
.NET複数データベース一括データ挿入、更新(SqlServer、MySql、PgSql、Oracleをサポートします。)
-
NETガベージコレクション GC診断ツール dotnet-gcmon 使用方法
-
30分でわかるコング経由の.NETゲートウェイ
-
.NET開発サーバー アプリケーション管理ツール
-
ASP.NET Core ディペンデンシーインジェクションの詳細
-
ASP.NET CoreでCAPの取引詳細を自動で有効にする
-
ASP.NET Core MVC Dependency Injection ビューとコントローラ
-
名前 'xxx' が現在のコンテキストに存在しない エラー解決方法の1つ