- PR -

ASP.NET2.0で子画面を作ったのですが。

投稿者投稿内容
けいこ
会議室デビュー日: 2006/08/02
投稿数: 5
投稿日時: 2006-08-07 13:25
こんにちは、
エラーの起きるコードは、
CType(Session(CConst.CSSNREGINFO), CSsnRegCnt).RegPage = Request.RawUrl
で、
エラーメッセージは、
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
セッションに入っているオブジェクトが消滅してしまうようです。

セッションのタイムアウトのみ1分に設定し、フォーム認証のタイムアウトは変更していなかったので、それが原因ではないかと思います。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-07 23:13
引用:

べるさんの書き込み(2006-08-04 21:31)より:
Form認証のtimeoutとセッションのtimeoutは別々に設定できた気がするのでそのせいかも。
(セッションが切れた時点でForm認証も切れた気がするんですけどね。。)


認証の方はクッキーなので、クッキーに設定された有効期間まで有効だと思います。
http://www.atmarkit.co.jp/fdotnet/aspnet/aspnet19/aspnet19_01.html


引用:

けいこさんの書き込み(2006-08-02 11:53)より:
子画面を表示させた状態で放っておき、セッションのタイムアウトが起きたあとで、子画面を操作させようとすると、ログイン画面にリダイレクトされます。


は!!すみません、よく読んでいませんでした。。。
認証の有効期限とセッションの有効期限は別なので、これは、なんかおかしいです。

 認証した情報を、どの様に保存していますか?
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-08-08 01:16
引用:
CType(Session(CConst.CSSNREGINFO), CSsnRegCnt).RegPage = Request.RawUrl
で、
エラーメッセージは、
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
セッションに入っているオブジェクトが消滅してしまうようです。

このときセッションは切れてるんですよね。だからSession変数はなくなっていて正しいです。

引用:
認証の方はクッキーなので、クッキーに設定された有効期間まで有効だと思います。

なるほど、セッションには依存しないんですね。
たとえばここの[はじめに]に「同一セッションに属する後続のすべての要求に対して、
認証チケットがブラウザから Web サーバーに渡されます。」なんて書いてあるから勘違いしてました。

実際ためしてみたらセッションが切れてからも認証を通りました。

引用:
子画面を表示させた状態で放っておき、セッションのタイムアウトが起きたあとで、子画面を操作させようとすると、ログイン画面にリダイレクトされます。

これがフォーム認証の期限も切れていたなら、正常ですね。
既定ではフォーム認証30分、セッション20分だったと思いますが。
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2008-09-30 14:33
上記と同様の状況で、親画面はセッションが消えた状態で残っているのですが、子画面でSession_Startメソッドが実行された場合は親画面で実行されません。
どこで拾えばいいかアドバイスお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-09-30 21:45
引用:

たつさんの書き込み (2008-09-30 14:33) より:
上記と同様の状況で、親画面はセッションが消えた状態で残っているのですが、子画面でSession_Startメソッドが実行された場合は親画面で実行されません。
どこで拾えばいいかアドバイスお願いします。


何をして、どうなって、どうしたいのか、さっぱりわかりません。。。
けいこさんの問題は、「子画面の場合は消去するかエラー画面に遷移する」ようにしていると思います。たつさんは、どうしたいのでしょう?(つーか、何を拾うの?)
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2008-10-02 10:45
すみません。省略しすぎましたf ^^;

セッションが切れていると、当システムではエラー画面に飛ばすように作っています。
具体的にはgrobal.asaxのSession_Start内に初回以外はエラー画面に飛ばす処理が入っています。
これによってセッションが切れた状態ではIEを閉じるしかない状態となります。

ですが、親画面からセッションタイムアウトの時間(当システムでは60分)以上経った後で子画面を呼び出すボタンを押下します。
子画面を呼び出すボタンはjavascriptで記述しているので、セッションタイムアウトに関係なく子画面が開きます。
が、子画面でサーバーにアクセスをしたタイミングでSession_Startが動き、子画面がエラー画面へと遷移します。

けいこさんと問題ではこの子画面の動作について話が進んでいますが、自分は残った親画面に問題があり投稿させていただきました。

セッションが切れているのは親も子も同様で、すでに保持していたセッションは消えています。
しかし、子画面でSession_Startが実行され、既に新しくセッションが作成されているので親画面ではSession_Startが実行されず、セッションがないまま登録処理が動き、不整合なデータが作成されてしまいました。

親画面でセッションが切れたということを再度拾うにはどうすればよいでしょうか。
という質問でした。


昨日考えた結果、自分なりの答えを出したのでそれについても書かせていただきます。

初めはgrobal.asaxのGlobal_PreRequestHandlerExecute内にログイン時に保持させた「ログインID」のセッションが存在するかどうかのチェックを行うようにしようと考えました。
でも、Global_PreRequestHandlerExecuteは全ての画面に影響がでるところですし、ログイン前に走ったときはチェックしない等の分岐が必要で、テストを考えると触りたくないところです。

そこで、エラー画面に遷移した時にSession.Abandonによって再度セッションを削除するようにしました。
これなら子画面でエラー画面へ遷移した場合でも、grobal.asaxでセッションが再作成された後エラー画面がセッション削除を行うので、親画面が次にポストバックしたときにSession_Startが実行され、エラーが検出出来るようになりました。
これなら修正箇所はエラー画面のみなのでテスト工数も少なくて済みそうです。


以上です。今度は長々と失礼しましたm(__)m

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