- PR -

設定時間前にセッションタイムアウトしてしまう

投稿者投稿内容
zoo8
会議室デビュー日: 2005/01/24
投稿数: 14
投稿日時: 2005-04-04 19:10
お世話になっております。早速質問なのですが、

[開発環境]
OS:Windows2000
言語:VB.NET
.NET:var1.1
サーバ:Windows2003

という環境でWebアプリケーションを開発しています。

[解決したい現象]
設定時間前にセッションタイムアウトしてしまうことがある

1.開発中のアプリケーションは、ログインユーザを管理するためにログイン時に
 Loginテーブルへレコードの追加。
 ログアウト、もしくはセッションタイムアウト時にレコードの削除。
 (セッションタイムアウト時のレコード削除処理はGlobal.asaxのSession_Endイベント に記述してあります。)

2.Web.configは
 <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424"  qlConnectionString="data source=127.0.0.1;user id=;password=" cookieless="false" timeout="20"/>
 となっているので、未操作時間が20分でセッションタイムアウトとなると期待しています。

3.全ての画面のPage_Loadイベントでセッションタイムアウトチェックのために以下のコードを入れてあります。
 If Session.IsNewSession = True Then
' ログイン画面へ遷移
 End If

以上のような処理なのですが、操作中に突然3.のチェックに引っかかり、ログイン画面に戻ってしまいます。ログイン情報は削除されているので、Session_Endイベントによる削除処理が働いているようです。


エラーログがないので
http://support.microsoft.com/default.aspx?scid=kb;ja;JP321792
のバグではないようです。

下記記事によると
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8559&forum=7
>メモリを物理メモリの何%以上使ったりと色々な条件でaspnet_wp.exeは自動的に再起動します。
とあり、これが原因なのではと思うのですが、この現象は回避できるのでしょうか?

解決策、アドバイス、よろしくお願いします。
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2005-04-04 19:34
引用:

zoo8さんの書き込み (2005-04-04 19:10) より:
下記記事によると
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8559&forum=7
>メモリを物理メモリの何%以上使ったりと色々な条件でaspnet_wp.exeは自動的に再起動します。
とあり、これが原因なのではと思うのですが、この現象は回避できるのでしょうか?


「思う」ということは、ご自分で検証していないのでしょうか?
であれば、まずそれを実証してからでないと先に進めませんよね?

以前同じ現象に遭い、webサーバのメモリが60%以上になるとaspnet_wp.exeが再起動されてしまうという原因でした。

知ってる限りでの解決策としては、

1.サーバのメモリを増量
3.メモリ食ってる処理を洗い出し修正
2.メモリリークしている箇所を洗い出し修正

といったところでしょうか。
ご参考まで。

#それでもダメなら、定期的に再起動かけるとか。

_________________
まゆりん @ わんくま同盟
Blog る。
zoo8
会議室デビュー日: 2005/01/24
投稿数: 14
投稿日時: 2005-04-04 20:13
まゆりんさん。返答ありがとうございます。

>まずそれを実証してからでないと先に進めませんよね?
>以前同じ現象に遭い、webサーバのメモリが60%以上になるとaspnet_wp.exeが再起動されてしまうという原因でした。
仰るとおりです。
サーバのメモリの使用率を確認しながら実行するという方法を思いつきませんでした。

>1.サーバのメモリを増量
>3.メモリ食ってる処理を洗い出し修正
>2.メモリリークしている箇所を洗い出し修正
>#それでもダメなら、定期的に再起動かけるとか。
なるほど、サーバの設定などでは管理できないのですか。プログラムのほうから確認してみます。

どうもありがとうございました。

NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-04-04 20:15
InProcでセッションを利用するのはプロセスリサイクリングの関係もありお勧めできません。
素直に、StateServerを利用しましょう。

#用語を間違えていたので訂正

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-04-04 22:15 ]
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2005-04-04 20:29
なるほど。

http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp06/entwebapp06_02.html
_________________
まゆりん @ わんくま同盟
Blog る。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-05 05:31
 っつうか、Session_Endが発生することに依存しちゃいけません。NAL-6295さんのStateServerやSQL Serverを使う方法だと、イベントは発生しませんし、再起動もイベントは発生していないと思います。おや、発生しているわ!(デバッグ中にビルドして、無理矢理アプリケーションを再起動)
 この場合、どこまでデータが保証されているのかわかりませんから、やはり使用するべきではないでしょう。

 元々ステートレスな技術であり、その上に無理矢理ステートフル(フルじゃないな)に実装しているので、無理矢理実装を信用するべきではありません。


 で、検索の条件を変更すると、Webアプリケーションで『ログインユーザを管理するためにログイン時にLoginテーブルへレコードの追加』するような設計をしちゃいかん、という回答が、出てきます。キャッシュにでもしまうような方法に変更するべきでしょう。
 その他、「ログインした時間」をログして、ログイン画面で「前回のログイン時間」として表示し、ユーザが管理するか。
 ブラウザの開け方によっては、同一PCから複数のログインが発生する可能性もあるので、多重ログインの禁止という目的では、管理しきれないはず。

_________________
zoo8
会議室デビュー日: 2005/01/24
投稿数: 14
投稿日時: 2005-04-06 13:05
レスが遅くなりまして、申し訳ありません。

サーバでIEを複数起動してメモリを圧迫してみたのですが、検証しているときに限ってセッションは切れず。IISの設定で時間を決めているようなのでそれでたまたまその瞬間に切れていたものか。
ただ、InProcでの制御はまずいことは皆さんのレスと、レス中の単語を検索してみてわかりました。
使用中にセッションが切れてしまうのはまずいのでSQL ServerでSession値を管理させる方法をとることになりそうです。

> で、検索の条件を変更すると、Webアプリケーションで『ログインユーザを管理するためにログイン時にLoginテーブルへレコードの追加』するよ>うな設計をしちゃいかん、という回答が、出てきます。

この件は、設計が根元から変わってしまうので、DBでの管理は残し、
ログアウト処理はユーザの方に気をつけてもらうということで進めるしかないようです。

大変勉強になりました。回答くださった皆さん、ありがとうございました。
ジョン吉
常連さん
会議室デビュー日: 2005/02/25
投稿数: 33
投稿日時: 2005-04-06 13:56
ログイン管理についてですが、客先要件で2重ログインの防止というのが有りまして、
色々検討しましたが、
完璧にはうまくいかにですよね。Webアプリケーションはステートレスですから。

一応、下記のような処理を考えましたが、費用対効果で客先には「本当に必要?」と再考して頂くことになりました。

・ログインしたときに同じIDのレコードがある場合、ログイン不許可
・ログインした時に新規でレコードをDBに追加
・ログアウト時に削除
・アクションが有るたびに Form_Load の先頭で、ログイン情報の時刻をアップデイト
・アップデイト対象がない場合、タイムアウトと見なし、ログイン画面へリダイレクト
・定期ジョブで、一定時刻更新のないレコードを削除 ⇒ タイムアウト処理

関数作って一発かませればいいのですが、そもそも2重ログインをなぜ防止する必要があるのか? から、再考して頂くようにしました。
セキュリティの問題であれば、パスワードの情報管理が根本の問題ですし。
誰がどんな機能を使用しているのか知りたいのであれば、ログを取ればいいだけのはずですし。

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