エンティティモデルを使用しているasp.net Webフォームアプリケーションがあります。ユーザーがログインすると、user_sessionテーブル内にtimeinを使用して行が作成されます。ユーザーがログアウトすると、その行が更新され、タイムアウトが発生します。ASP.Net - ブラウザが閉じられている場合、データベーステーブルの行を更新するには
ユーザーがログアウトせずにブラウザを閉じると、user_sessionテーブルの行をどのように更新できますか?
エンティティモデルを使用しているasp.net Webフォームアプリケーションがあります。ユーザーがログインすると、user_sessionテーブル内にtimeinを使用して行が作成されます。ユーザーがログアウトすると、その行が更新され、タイムアウトが発生します。ASP.Net - ブラウザが閉じられている場合、データベーステーブルの行を更新するには
ユーザーがログアウトせずにブラウザを閉じると、user_sessionテーブルの行をどのように更新できますか?
できません。ブラウザーがクライアントによって閉じられたことをサーバーに通知する方法はありません。あなたができることは、実行して行を更新するSQL Server上でいくつかの仕事をスケジュールすることです。 Session_End
イベントの購読をGlobal.asax
で試行することもできますが、アウトオブプロセスセッションを使用している場合はこのイベントが発生しない可能性があるため注意が必要です。
Global.asax.csでは、Session_End
イベントでそれをコーディングすることができます。セッションのタイムアウト(デフォルトは20分)までは発生しませんが、それは起こります。 Application_Start
および/またはApplication_End
イベントの既存のレコードを削除することをお勧めします(コンピュータまたはWebプロセスがApplication_Startを使用するのに最適な状態でApplication_Endイベントが実行されない場合)。
短い答えは:できません。だからこそ、あなたはそのようなばかげたことをしようとすべきではありません。
これ以上の答えは次のとおりです。セッションタイムアウトの遅延応答を待たなければなりません。それはかなりの時間がかかることがあります。 Global.asaxには、Session_Endというイベントがあります。あなたが望むことをするためにフックできますが、ユーザーがブラウザを閉じたときには表示されません。セッションが終了したときにのみ起動されます。これは、デフォルトでは最後の要求から20分後です。これはメモリ内のセッションで、プロセスがクラッシュしていない場合に限られます。
もっと良い解決策は、ユーザーのオンライン表をクリアするために頻繁にジョブを実行することです。これは問題にかかわらず問題を解決しますが、何を削除するかを把握するためにはあなたの仕事にもっと多くの作業が必要です。
私はAspStateのような有効期限の切れたセッションを閉じるスケジュールされたジョブであるべきだと思います。
AspStateデータベースのストアドプロシージャDeleteExpiredSessions
を調べて、実行する必要があることを確認できます。名前がASPState_Job_DeleteExpiredSessions
のこのプロシージャジョブは、1分ごとにセッションを終了するように呼び出します。
Global.asaxでEvent_Endイベントを使用できます。 セッション設定に応じて、ブラウザの終了と実際のセッションタイムアウトの間に遅延が発生することがあります。
次のコードを試してください。
すべてのページのform_load
イベントでは、次のコードを記述してください。
Response.AppendHeader("Refresh", "60; URL=../default.aspx")
デフォルトのセッションタイムアウトは20分で、このデモでは「60」秒を使用しています。この時間内にアクティビティがない場合は、デフォルトまたはホームページに戻り、データベース「セッションキー」または他のタグを更新するためのキーを送信します。このようにして、ユーザーまたはメンバーの活動を知ることができます。
これは私のために働いた。
あなたは実際にここにいくつかの有益なコンテンツを持っていたので、私はそれを残しています。あなたのリンクはセッションについてだった。実際にこの質問*または*あなたの答えとは関係ありません。 –
次に、ユーザーあたり1つのアクティブなセッションのみが許可されるシステムを実装するにはどうすればよいですか。なにか提案を? – Riz
@eFriend、スケジューリングされたジョブは失効したセッションを確実に消去します。もちろんこれは後で起こるかもしれません。したがって、ユーザーがブラウザを閉じて再度ログインしようとすると、セッションがタイムアウトするまで成功しない可能性があります。私が言ったように、ユーザーがブラウザを閉じたことをサーバー上で知る信頼できる方法はありません。 –
WebフォームC#でスケジュールされたジョブを作成するにはどうすればよいですか? – Riz