- PR -

[ASP.NET]全接続クライアントのセッションをクリアしたい

投稿者投稿内容
Rafa
会議室デビュー日: 2004/03/24
投稿数: 3
投稿日時: 2004-03-24 21:45
初めて投稿します、よろしくお願いします。

ASP.NETでWebアプリを開発中です。
ログオン画面にてログオンされた場合、セッションに
社員IDを格納し、各画面で社員IDをチェックする事により
セッションのタイムアウト・未ログインをチェックしています。

ある画面でボタンを押下された場合、そのWebアプリに
接続している全ユーザーのセッションをクリアし、
一旦強制的にログオフさせたいのですが、可能でしょうか?

Application_End, Application_Startをプログラム中から
起こせればよいと思ったのですが、HttpApplicationの
ヘルプを見てもそれらしいメソッドは無さそうです。

何か方法はありますでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-25 08:56
引用:

Rafaさんの書き込み (2004-03-24 21:45) より:

ある画面でボタンを押下された場合、そのWebアプリに
接続している全ユーザーのセッションをクリアし、
一旦強制的にログオフさせたいのですが、可能でしょうか?


 そんなことをすると、ある人が何らかのデータを書き換えている最中に、そうですね、「更新」ボタンを押したら、「ログインしていません」と言われることがありますよね。基本的に、他のセッションは変更できません(ASP.NETメーリングリストでも、同じような質問があがっているんだよなぁ)。

 セッションがインプロセスであるなら、ワーカープログラムを再起動させることで、セッションを破壊することができます。ワーカープログラムは、アプリケーションのbinディレクトリの中が書き換わると、再起動します。
(ワーカープログラムが再起動ではなく、アプリケーションドメインが再読込される、かな?)
Rafa
会議室デビュー日: 2004/03/24
投稿数: 3
投稿日時: 2004-03-25 11:01
やっぱりできませんか・・・。
でも出来ない事が分かっただけでもありがたいです。

更新→ログオフはJittaさんの仰る通りなのですが、LAN環境で使用するアプリで、
かつリカバリや不具合調査の場合にのみ行う処理なので、よいかな〜と考えています。
(実際行う場合はユーザーに通知して、処理の間システムを扱わないよう
 お願いすると思うのですが、保険のためにログオフさせたかったのです)

Binにファイルを置いて書き換えると言うのは楽でよいですね。
WebConfigを書き換えても再起動できるようなので、システムの構成等を
考えて、どちらかにしたいと思います。
危険だから駄目、と言われたらフラグ管理するしかないかな〜(^^;;

ありがとうございました。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-03-25 11:18
NAL-6295です。

例えば、

1・HttpApplicationStateにフラグをセットしておいて、
2・各セッションに要求があった時、そのフラグを見て、
3・○○のため、強制ログオフしました。的ページに飛ぶ。

ってのはどうですか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-25 11:21
引用:

Rafaさんの書き込み (2004-03-25 11:01) より:

Binにファイルを置いて書き換えると言うのは楽でよいですね。
WebConfigを書き換えても再起動できるようなので、システムの構成等を
考えて、どちらかにしたいと思います。
危険だから駄目、と言われたらフラグ管理するしかないかな〜(^^;;


 前提として、セッション変数の管理をワーカープロセスが行っている必要があります。セッション変数をSQL Serverに格納したり、他のサーバに管理させていると、ワーカープロセスが再起動しても、セッション変数は残ります。
 ワーカープロセスの再起動は、他に「システム全体の60%(デフォルト)に当たるメモリを確保したとき」というのがあり、アクセス数が多い、セッション変数に大きなオブジェクトを格納する、セッション持続時間が長い、などのことが要因となって、必要なセッション保持が行われなくなる可能性があります。こうなってから、セッション管理をアウトプロセスにすると、その辺も作り直さなければなりません。

 最初からフラグ等で作成することをおすすめします。
Rafa
会議室デビュー日: 2004/03/24
投稿数: 3
投稿日時: 2004-03-25 13:24
>>NAL-6295さん
その方法も一度は考えたのですが、実はセッションをクリアしたいのが
上記質問のパターンの他にもうひとつありまして・・・

ログオン時に1回だけDBから取得した値をセッションに入れて
使い回しているのですが、このDBの値が変更される可能性があります。
(通常運用ではなく、これもリカバリ時等の非常時です)
この場合、接続ユーザーは再度ログオンさえすれば引き続き
システムを利用できるようにしたいのです。

アプリケーション側のフラグだけでは判断できないので、
Application変数にログアウトさせたい時点の日時を格納し、
各セッションにはログオン日時を格納。それを比較する事で
ログアウトさせようと考えています。

>>Jittaさん
セッションはおそらくワーカープロセスが管理する事になると思います。
ですが、やっぱりシステムが動いている環境を無理やり変更して
再起動って言うのは怖いですね・・・
フラグにすれば汎用的に他の用途にも使えそうですので、
そちらの方向で考えてみます。

お二人ともありがとうございました
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-25 16:20
引用:

Rafaさんの書き込み (2004-03-25 13:24) より:

ログオン時に1回だけDBから取得した値をセッションに入れて
使い回しているのですが、このDBの値が変更される可能性があります。
(通常運用ではなく、これもリカバリ時等の非常時です)
この場合、接続ユーザーは再度ログオンさえすれば引き続き
システムを利用できるようにしたいのです。


 全ユーザが共通して見るようなものなら、キャッシュというのもあります。これだと、時間の他に特定のファイルが更新されたときに破棄することができます。
 たとえば、「DBにアクセスして値を取得する」メソッドを作成し、その中で「キャッシュされていればキャッシュから取り出す」ように作ります。そして、「DBからとったときは、特定ファイルに取り出した日時を書き込む」ようにし、キャッシュの有効期間と特定ファイルを結びます。・・・こんなこともできませんか?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-03-25 17:46
NAL-6295です。

運用時にはDBの変更がなく、管理時にDBの変更が発生する。
ということであれば、DBの内容をセッションではなく、httpApplicationStateに保持するとか。

スキルアップ/キャリアアップ(JOB@IT)