- PR -

セッションタイムアウト後にSession_Endイベントでの処理をしてから別アプリケーションへ遷移したい

投稿者投稿内容
tpkr
ベテラン
会議室デビュー日: 2003/02/24
投稿数: 55
投稿日時: 2004-11-30 21:12
お世話になっております。
ただいま、VB.NET/ASP.NETで開発しておりますが、アプリケーションが切り替わるタイミングでの処理で思うように行かずに悩んでおります。

ちょっとややこしいのですが、問題は以下のようなものです。

-----
アプリケーションA(APP_Aとします)のボタン押下イベントで、別アプリケーション(APP_Bとします)の画面へResponse.Redirectで遷移する際に、APP_AのSession_Endイベント内でAPP_Aの終了処理を行っております。
APP_Aのセッションが生きているうちは問題なくAPP_AのSession_Endを通過し、終了処理も実行できるのですが、APP_Aのセッションタイムアウト後に遷移イベントを起こすと、APP_AのSession_Endイベントを通過せずにAPP_BのSession_Startイベントが起こってしまいます。

遷移イベント内ではSession.Abandon()を行い、明示的にセッションを切っています。
一旦App_Aのセッションがタイムアウトした後でも、クライアントからの遷移ボタン押下イベントの起動によって新しいセッションが張られると思うので、そのボタン押下イベント内でSession.Abandon()を行って明示的にAPP_AのSessionを終了させた後で、Response.Redirectを行えば、APP_Aの終了処理を行うことが出来ると考えたのですが、何か勘違いをしているのでしょうか。

どなたかご教授いただけると有難いです。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2004-12-01 10:25
この質問は、うまくいかなかったのでどこが悪いのかを聞いているものですか。
それとも、この方法は適切かそうでないかを知りたいのですか。

_________________
たつごろー
codeseek
こみゅぷらす
tpkr
ベテラン
会議室デビュー日: 2003/02/24
投稿数: 55
投稿日時: 2004-12-01 10:45
どこが悪いかを知りたいです。
(もちろん、そもそもこの方法が適切でないのであれば、別な方法を考えなければならないと思っていますが。)
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2004-12-01 12:18
> APP_Aのセッションが生きているうちは問題なくAPP_AのSession_Endを通過し、
> 終了処理も実行できるのですが、APP_Aのセッションタイムアウト後に遷移イ
> ベントを起こすと、APP_AのSession_Endイベントを通過せずに
> APP_BのSession_Startイベントが起こってしまいます。

この部分が期待した挙動ではない、ということでしょうか。

どういう挙動だと期待したものですか。


どうしてもSession_Endイベントで行わなければならない処理ではないのなら、
遷移イベント内で終了処理を行うというのではだめなのでしょうか。

Session_Endイベントは、タイムアウトの時に起きていませんか?
それで終了処理をやっているのでしたら、再度通すことのほうに問題がある
とも思いますが、考慮されていますか。

Session_Endイベントを使った終了処理自体は、私自身は賛成しかねます。
過去にこういうコードのシステムにかかわったことがあって、それは、動作
はしていました。

_________________
たつごろー
codeseek
こみゅぷらす
tpkr
ベテラン
会議室デビュー日: 2003/02/24
投稿数: 55
投稿日時: 2004-12-01 13:40
たつごろーさん、ご返答ありがとうございます。
以下、疑問型で書かれた事に対して返答いたします。


>どういう挙動だと期待したものですか。

期待している挙動は、突き詰めて言えば「APP_Aの終了処理が実行される」ということです。(APP_Bの開始処理との時間順序的整合性は問いません)
APP_AのSession_Endイベントは、今回の手続き(セッションタイムアウト状態からのボタン押下イベント内でのSession.Abandon→Response.Redirect(APP_B))を踏んだ場合には発生していない模様です。
APP_Aの通常のタイムアウトの発生時、およびセッションが生きている状態からのボタン押下によるアプリケーション遷移時には終了処理を実行した結果が出ております。

>どうしてもSession_Endイベントで行わなければならない処理ではないのなら、
>遷移イベント内で終了処理を行うというのではだめなのでしょうか。

APP_Aのアプリケーション終了処理ですので、ブラウザの×ボタン押下によって画面ごと消された場合でもAPP_Aの終了処理として実行したいと考えています。その対策も含めてSession_Endで処理させるべきなのかと考えました。

>Session_Endイベントは、タイムアウトの時に起きていませんか?

APP_Bへ遷移後のセッションのタイムアウトまで待ってもAPP_Aの終了処理の動作結果が確認されないため、起こっていないと思われます。

>Session_Endイベントを使った終了処理自体は、私自身は賛成しかねます。

もしよろしければ、この理由を教えていただけないでしょうか。
確かにいくつかの日本語英語のサイトを回ってみてもGlobal.aspxのイベントは制御が難しいようですが、提供されている機能であるならば、ちゃんと理解さえすれば制御可能なのだと考えているのですが…。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2004-12-01 15:03
引用のため文を整形しました。

> 期待している挙動は、突き詰めて言えば「APP_Aの終了処理が実行
> される」ということです

APP_Aの終了処理をSession_Endだけではなく、別の終了の可能性の
あるところにも記述すればよいのではないでしょうか。
二重に終了処理を通っても問題ないようにしておく必要はあります。

> APP_Aのアプリケーション終了処理ですので、ブラウザの×ボタン
> 押下によって画面ごと消された場合でもAPP_Aの終了処理として実
> 行したいと考えています。その対策も含めてSession_Endで処理さ
> せるべきなのかと考えました。

>> Session_Endイベントを使った終了処理自体は、私自身は賛成し
> かねます。
> もしよろしければ、この理由を教えていただけないでしょうか。

Session_Endだけでの終了処理は間違いだと思っています。
Webシステムでは、クライアントとなるIEなどのHTMLユーザエージ
ェントプロセスが終了したことが、Webアプリケーションの終了と
完全に一致するわけではないからです。
IEは単なる表示のための窓口であって、アプリケーションとの連携
を保障するクライアントソフトにはなれません。
(まぁ、もともと、クライアントとサーバという分離がされた時点で、
完全な連携をとろうとすること自体が幻想に近いとも思うのですが。)
2つ以上に分かれている以上、それらが正常に通信ができないとい
う状態になっても、不整合の無いように組む必要があります。とこ
ろが、Webで作成できるシステムでは、プログラミングで押さえつけ
ることのできる範囲が狭すぎます。それでもメリットがあるという
ときだけWebでのシステムにすべきだと思います。
Session_Endが自由にならないということは、そういうことのほんの
一部でしかありません。WindowsFormのプログラミングに比較して、
とても苦労してユーザ要件に対応することになるでしょう。

>> Session_Endイベントは、タイムアウトの時に起きていませんか?

> APP_Bへ遷移後のセッションのタイムアウトまで待ってもAPP_Aの終
> 了処理の動作結果が確認されないため、起こっていないと思われます。

> APP_Aの通常のタイムアウトの発生時、およびセッションが生き
> ている状態からのボタン押下によるアプリケーション遷移時に
> は終了処理を実行した結果が出ております。

タイムアウト後に「遷移イベント」を起こしたときに、Session_Endを
通らない、ということですね。
どうしてだかは、私には判りかねますが、私ならそういう挙動でも
困らないものに書き換えるだけです。



_________________
たつごろー
MCSD.NET、MCDBA、MCSA、MCAD
Oracle Master Platinum 9i、Oracle Master Linux+

[ メッセージ編集済み 編集者: たつごろー 編集日時 2004-12-01 15:07 ]
tpkr
ベテラン
会議室デビュー日: 2003/02/24
投稿数: 55
投稿日時: 2004-12-01 19:52
たつごろーさん、何度もありがとうございました。

結局、「遷移イベント」内の処理で条件文を設定し、Session.IsNewSessionがTrueの場合にSession_Endで行っていた処理を行うようにすることで期待した挙動をさせることが(完全ではないとは思いますが)できました。


Session_Endを使用した終了処理というのは、仰る通りなるべくなら行うべきでないとは思います。(思ってはいるのですが、他に良い方法が…)
ご忠告として、受け止めさせていただきます。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2004-12-02 11:26
どうしてもSession_Endを呼び出したいということでしたら、対処方法として、
ボタンイベントのコードから、別アプリを呼び出してSession.Abandon()をす
る別のページへ遷移することで可能かもしれません。
それでもうまくいかなければ、JavaScriptでうまくいくようなタイミングで
リロードしてみたりとか、いろいろ考え付きます。
どうしても、ということなら。

tpkr様へ
問題はいったんは対策ができたとして、気になることが4点ほど残ってたので、
将来のために確認させていただけませんでしょうか。

1.すでに呼ばれているのではないでしょうか。
タイムアウト後の遷移イベントでSession_Endが呼び出されない、という条件の
とき、すでにタイムアウトによってSession_Endが呼ばれているので終了処理が
されている、ということはなかったですか。

2.呼ぶ必要があるのはどういう処理だった?
遷移イベントはボタン押下イベントで起こる、とのことですが、タイムアウト
後でしたら新しいセッションになってしまうので、終了処理はいらないのでは
ないでしょうか。Session以外に入れた情報をクリアしたいということでしょうか。

3.もしかして、データベース接続ですか?
データベース接続を何らかの方法でキャッシュしているということでしょうか。
ASP.NETでは、データベースへの接続をつかむ時間を最低限にするほうが、
必ずではないけれど、よりよい状態になりやすいです。

4.なぜ呼ばれないのか。
なぜSession_Endが呼ばれないのかが提示された条件ではわかりませんでした。
ボタン押下イベント、とはどういうコードだったのでしょうか。

_________________
たつごろー
codeseek
こみゅぷらす

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