タイトル一覧   関連タグ: Web C#
タグ:Web C# タイトル:セッション変数の値が消えたり書き換わる?
1 2
1:  お名前:katsu 2004/03/08 9:45:08

運用開始から1年ほど経っているシステムで、不可解な現象が起こりました。

Session["A"] = "aaa";
Session["B"] = "bbb";
  :

if (Session["A"] == "aaa")
{
 "aaa"のときの処理
}
    :
if (Session["B"] === "bbb")
{
 "bbb"のときの処理
}
else
{
 "bbb"以外のときの処理
}

上記のような処理で、

"aaa"のとき処理
"bbb"以外の時の処理

が実行されてしまいました。

再現性はなく、突発的に何かが起きたような気がするのですが、
そもそも、セッション変数の値が消えたり、書き換わるようなことは
どんなケースで考えられますでしょうか?
憶測、経験値なんでも構いませんのでお願いします。
プログラムの途中で同変数(B)を書き換えている箇所は見つかっていません。(1年近く安定運用しているシステムですので、バグだったらもっと早く発覚していると思われ...)


運用している環境
Windows2000 Server
ASP.NET
IIS5.0
.NET FrameWork1.0.3705
2:  お名前:katsu 2004/03/08 9:52:45

ごめんなさい、ちょっと訂正

例文中

if (Session["B"] === "bbb")



if (Session["B"].ToString() === "bbb")

の誤りです。
3:  お名前:まおうさま 2004/03/08 13:01:22

Virus Scan 系のソフトがインストールされていませんか?
だとすれば
http://support.microsoft.com/default.aspx?scid=kb;ja;316148
を参考にしてみてください。
4:  お名前:katsu 2004/03/08 13:39:31

返信ありがとうございます。

ココにUPした後、この記事を見つけたのですが、
当該の環境にはVirus Scan系は稼働していません。

ん~、悩ましいです。

5:  お名前:なちゃ 2004/03/08 15:19:42

> Session["A"] = "aaa";
> Session["B"] = "bbb";
はどこに書いているんでしょう?

> "aaa"のとき処理
> "bbb"以外の時の処理
が実行されてしまいました。
一度のコードの流れで両方が実行されたんでしょうか?
Session["B"]の値だけがクリアされてしまったということでしょうか?

少なくともおかしなことが発生しない限り、
Session["A"] == "aaa"
Session["B"] != "bbb"
ということは起こりえないってことなんですよね?
# あ、Session["B"]は書き換えてないんでしたね…

もし何らかの拍子にセッションがクリアされてしまったとしても、その場合片方ではなく両方がクリアされるはず(アプリが再起動された場合)ですし、また、現在実行中のコードが、あるタイミングでセッションがクリアされた後、クリアされた状態で続きを実行するということはありえません(もちろんプログラムでクリアしているような場合は別)。

ちょっと細かい状況が分からないんですが、ただ、突発的に一度起こっただけとかなら再現も難しいでしょうしね。
ちなみにこれが発生したとわかったのはどうしてなんでしょうか?
ログ出力とかで確認?
6:  お名前:katsu 2004/03/08 16:16:20

返信ありがとうございます。

>> Session["A"] = "aaa";
>> Session["B"] = "bbb";
>はどこに書いているんでしょう?
正確にはそれぞれ別々のWebフォーム(aspx)のコードビハインドで設定しています。

>> "aaa"のとき処理
>> "bbb"以外の時の処理
>>が実行されてしまいました。
>一度のコードの流れで両方が実行されたんでしょうか?
一度のコードです。
>Session["B"]の値だけがクリアされてしまったということでしょうか?
そうなんです。

>少なくともおかしなことが発生しない限り、
>Session["A"] == "aaa"
>Session["B"] != "bbb"
>ということは起こりえないってことなんですよね?
># あ、Session["B"]は書き換えてないんでしたね…
書き換えてないんです。(^^;;

>もし何らかの拍子にセッションがクリアされてしまったとしても、その場合片方ではなく両方がクリアされるはず(アプリが再起動された場合)ですし、また、現在実行中のコードが、あるタイミングでセッションがクリアされた後、クリアされた状態で続きを実行するということはありえません(もちろんプログラムでクリアしているような場合は別)。

ですよね。

>ちょっと細かい状況が分からないんですが、ただ、突発的に一度起こっただけとかなら再現も難しいでしょうしね。
>ちなみにこれが発生したとわかったのはどうしてなんでしょうか?
>ログ出力とかで確認?

もう少し正確に書くと

-----------ここから
if (Session["User"].ToString() == null)
{
 <タイムアウトを知らせる画面への遷移>
}
 :
 :<データ編集処理など>
 :
if (Session["Mode"].ToString() == "Insert")
{
 <DBレコード追加>
}
else
{
 <DBレコード更新>
}
-----------ここまで一連の処理

のような感じになってまして、
Session["Mode"] に "Insert" が入っていることを期待すべきところ
<DBレコード更新>が走ってしまい、
レコード更新すべきキー項目(これもセッション変数)が残っていたため
追加すべきレコードの内容で、全く無関係なレコードに置き換えてしまいました。

仕様的にもまずいと思いましたので、
Session["User"] = "Insert"; する時点で残っている更新キーの値をクリアすると共に、
上記処理に入る前にSession["Mode"]の値をチェックするように変更しました。

なんですが...気味悪くて...

もう一度、プログラムを疑ってみようかな?


7:  お名前:石野光仁 2004/03/08 16:26:54

・・・ もしかして 画面が二枚立ち上がっていた
なんてことは無いですよね。

ちょっと 気になったもので。
8:  お名前:katsu 2004/03/08 16:51:07

返信ありがとうございます。

ん~、ユーザーさんに確認したのですが、
「いつも通り」という回答だったので、
疑っていませんでした。

そうかぁ~、でも、新規ブラウザーを立ち上げると
デフォルトの設定では別プロセスで立ち上がるんで、
セッションも別になるのですよね?
(設定によっては同じプロセスで立ち上がるけど)

それにこのWebアプリの画面遷移はすべて、
LinkButtonを配置してサーバーサイトでやってるんで、
ブラウザー上で右クリックして新しいウインドウで遷移できないように
してるんですが...謎深まる



1人で作業しているんで、こうしていろんな方の突込みがあると
非常にありがたいです。
9:  お名前:石野光仁 2004/03/08 16:58:47

左上のファイルのところからウィンドウを表示したり、
CTRL+Nとキーを押してみてください。

表示されたウィンドウは
おそらく同一セッションです。
両方のウィンドウでシステムを動かしてみてください。
嫌なことに正しく動きます。
ということは、同一セッションを貰っているということですね。

まぁ 結局のところ、HTMLの中に埋め込まれたIDでも使って
サーバーと同期をとっているってことですね。
セッション管理なんてそんなものです。
#嘘を書いていたら訂正お願いします。 < セッション。
10:  お名前:katsu 2004/03/08 17:13:22

>CTRL+Nとキーを押してみてください。
>表示されたウィンドウは
>おそらく同一セッションです。
>両方のウィンドウでシステムを動かしてみてください。
>嫌なことに正しく動きます。
>ということは、同一セッションを貰っているということですね。
おおっつ!CTRL+Nは思いもしませんでした!!
完全に同じ画面が複数上がりますね!
CTRL+Nはユーザさんが無意識のうちに押してしまう可能性は大ですね。
(このシステム、英文字入力それも大小文字を切り替える場面が多々
 あるので、SHIFT+NがCTRL+Nになってしまった可能性大です)

これかも?
実験してみます。

1 2
お名前
メッセージ
次回のために入力情報を記録