- PR -

Session の内容が変わる???

1
投稿者投稿内容
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2009-03-06 22:39
お世話になります。

Session["xxx"]="文字" で保存した内容がプログラム上変更していないのにポストバックなど繰り返すと値(内容)が書き換わったりするなどの現象っておきたりするのでしょうか?
うまく説明できないのですが、ボタンを押して数回ポストバックしたりすると内容が一部書き換わっています。
書き換わるのは、セッション内の変数の一部でなくすべてが他のセッションデータに置き換わります。
実際には、下記のセッションがあります。

UserID = (string)Session["ID"];
KanjaName = (string)Session["Kanja"];
Age = (string)Session["Age"];
Sex = (string)Session["Sex"];
StartDate = (string)Session["StartDate"];
StartTime = (string)Session["StartTime"];
EndDate = (string)Session["EndDate"];
EndTime = (string)Session["EndTime"];
DeviceNo = (string)Session["DeviceNo"];
DeviceStr = (string)Session["DeviceStr"];
このうち、Age に性別データが入り、StartDateにTextBox4.Textの内容が入ってます。
ポストバック直前に値を代入しているわけでもなくポストバック後に内容が変わっています。
調べる手段がわからなくて困っています。たとえば、C#でメモリの不正な位置へのアクセスとかでメモリ破壊など起きているのかと勝手に推測したりしてますが見つける手段がわかりません。
この奇妙な現象の見つけ方などアドバイスありましたら教えてください。
よろしくお願いします。

WindowsVista C# VS2005
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-03-07 00:48
> すべてが他のセッションデータに置き換わります。

とはどういう意味でしょうか。
全てのセッション情報が変更していないのに別の値に変わっているという事でしょうか。
そうであれば UserID や KanjaName も変わっているわけですよね。
どういう値に変わっているのでしょうか。
他の人の UserID や KanjaName に変わっているのか、
それとも意味のない値が入っているのか、どちらでしょうか。
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2009-03-07 08:07
お世話になります。

> 全てのセッション情報が変更していないのに別の値に変わっているという事でしょうか。
すべてではなく、一部のセッション(このケースは、2つを確認)の値が他のセッションの値になっている。という意味です。意味不明の文字などではありません。
ポストバックを繰り返したりする中で「データが他のセッションの値に置き換わっている」みたいです。つまり、何回か行った後です。最初の数回は、OKです。
その間に、Session["xxx"]="文字"のように値を代入しているようなコードはなくどこでデータが変更されているのかわかりません。
今回のデータが変わっているのは、
Age = (string)Session["Age"];
StartDate = (string)Session["StartDate"];
の2つだけのようです。データを取り出すとAgeが"女"、StartDateが"0歳"になっています。この内容も毎回値が変わるのでなく、同じ内容になってます。

思うに、プログラム上Session["xxx"]="文字"としない限りデータが書き換わることはないと思っていましたので、プログラムで値を代入している個所を探していますが未だに怪しい箇所が見つかりません。

それで、考えられるほかの原因などありましたらアドバイスをいただきたいと思い投稿しました。
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2009-03-07 12:47
Age をクラスにして、ToString の呼ばれるタイミングでログ吐いて
みたらいいんじゃないですか?

セッション内で値が突然書き換わるのはそれなりの理由があるわけで
プログラムかもしれないし、セッションDBのシリアライズのバグかも
しれないし。なんともいえないけど。セッションDBのシリアライズと
か疑っちゃうとどーしょーもないので自分のコードが100%悪いと
決め付けて原因追求した方が無難です。

うちの従来のコードでも、不気味なコメントと共にセッションの値が
消えるとか書いてありw、その対応に関するコードがツラツラ書いて
あったりします。過去コードを改変するのはしんどいので、今回の修
正からは、1アクションクラス(ASPX単位)でセッション変数1個に
制限しました。


>ポストバックを繰り返したりする中で「データが他のセッションの値に置き換わって
>いる」みたいです。つまり、何回か行った後です。最初の数回は、OKです。

リクエストパラメータとセッション変数の名前が同じでリクエストがあるたびに、
パラメータを取得する場所で強制的にセッション変数に格納している、なんて場合
だと、「非活性」にしたフォーム要素をパラメータ取得すると、値は null です。
LEFT JOIN と同じですね。
セッションの値が消えるなんてのは往々にしてこんなケースだと思います。
作為的なコードが入っていない場合は。

べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2009-03-07 13:04
引用:
その間に、Session["xxx"]="文字"のように値を代入しているようなコードはなくどこでデータが変更されているのかわかりません。

引用:
思うに、プログラム上Session["xxx"]="文字"としない限りデータが書き換わることはないと思っていましたので、プログラムで値を代入している個所を探していますが未だに怪しい箇所が見つかりません。

逆に、セッション変数に値を代入しない限り値は設定されませんよね。
各セッション変数にはどのタイミングでどうやって値を代入してるんですか?
原因はそこにあるような気がします。
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2009-03-07 21:30
お世話になります。

> 自分のコードが100%悪いと決め付けて原因追求した方が無難です。
それは、そう思っています。その箇所が見つけられないだけだと認識しています。
その手段は、.......
と考えていました。過去ログなど見ていましたらこんなのを見つけました。
http://www.atmarkit.co.jp/fdotnet/dotnettips/040trace/trace.html

これを実行して、その都度セッションの内容を吐かせブレークポイントを張って怪しいハンドらを追っていました。
すると、その間違ったデータを書いている箇所を見つけることができました。
まだ、解決に至っていませんが、とりあえず、解決の第1歩でしょう。たぶん

もう少し、調べてみます。お世話になり、ありがとうございました。

しかし、こんなトレース機能があると思いませんでした。
<%@ Page Language="C#" ........ Trace="true" %>
で、かなりの情報が表示されますね。セッション以外見方がわかりませんが...
1

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