- PR -

Global_asaxでのセッション情報の使用方法

投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2008/01/15
投稿数: 65
投稿日時: 2008-03-25 18:57
Global_asaxのApplication_BeginRequestまたはApplication_AcquireRequestStateでセッション情報を参照・更新したいのですが何故か「このコンテキストではセッション情報は使用できません」というエラーになってしまいます。
HttpContext.Current.SessionがNothingなのが原因だと思いますが、http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=40386&forum=7 等を見るとGlobal_asaxの中でもセッション情報は参照できると書いてあります。
何か設定が必要なのでしょうか?
VS2005のWebサイトとWebアプリケーションの両方で試しましたがどちらもセッション情報は参照できませんでした。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2008-03-26 06:41
下記掲示板を参照してみてください。

http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-25191.htm

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
未記入
ベテラン
会議室デビュー日: 2008/01/15
投稿数: 65
投稿日時: 2008-03-26 10:00
引用:

Accessさんの書き込み (2008-03-26 06:41) より:
下記掲示板を参照してみてください。

http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-25191.htm





すみません。
意図を汲み取れないのですが、上記のURLを教えていただいた理由は「Application_BeginRequestではセッション情報を見れない」という部分だけを教えて頂いたのでしょうか?
それとも「Application_BeginRequestと同じようにApplication_AcquireRequestStateでも見れないよ」とご説明いただいているのでしょうか?
それとも、HttpContext.Current.Request["__VIEWSTATE"]のような形式でVIEWSTATEを使えというアドバイスなのでしょうか?


どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-03-26 11:55
AcquireRequestStateにたどり着いている、ということはApplicationイベントの発生順とかはご存知ですね。
AcquireRequestStateで取れないということなら、PostAcquireRequestStateで確認してみたらどうでしょうか。
http://msdn2.microsoft.com/ja-jp/library/system.web.httpapplication(VS.80).aspx

ページクラスの実行前に確認したい、ということならPreRequestHandlerExecuteでもよさそうですが。
未記入
ベテラン
会議室デビュー日: 2008/01/15
投稿数: 65
投稿日時: 2008-03-26 15:45
PostAcquireRequestStateでも同じで、セッション情報を取得することは出来ませんでした。

説明していませんでしたが、やろうとしているのは次のような動作です。

1.a.aspxのpageloadでセッション情報を設定
2.b.txtをgetしに来た所をApplication_AcquireRequestStateで捕まえて、先程設定したセッション情報を参照

セッション情報を設定したドキュメントが異なってもセッション情報は参照できると思いますので流れとしては合っていると思うのですがなぜか2のセッション情報を参照するときになると、セッション情報が空の状態です。
1->2の順番に流れていることはデバッガーで確認しました

【a.aspx】
<head runat="server">
<title>無題のページ</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<iframe id="iframe" src="b.txt"></iframe> </div>
</form>
</body>
</html>

これを書いている途中でもしかしてb.txtの拡張子が問題なのではないかと思い、
ためしに b.html b.aspx など変えてみたところ動きが変わりました。
b.html ではb.txtと同じような動きでセッション情報は取得できませんでしたが、b.aspx ではApplication_AcquireRequestStateに遷移してきませんでした。
ちなみにb.txt、b.html、b.aspxともファイルは存在しません。
Global.asaxでセッション情報を確認する上では関係ないと思ってたのですが、
拡張子やファイルの有無がApplication_AcquireRequestStateに到達するための
動作やセッション情報の取得に影響を与えるのでしょうか?
※b.txt、b.htmlでセッション情報を取得しようと考えている訳ではありません。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-03-26 16:32
ふむ、iframeの内部ソースということだと、a.aspxとb.txtは並行して動作しますから、セッション情報が設定されてるかどうかは必ずしも確定しませんね。
一番の問題はそこでしょうね。

どうしてもそのような動きをさせたい、ということなら、a.aspxでJavaScriptを利用してページのロードが終わったことを確認してからb.txtをiframeのソースとして設定するとかいった動作をさせることになるかなぁ。

ちなみに、デバッガーといっているので開発サーバ上で確認作業をしているものと思われますが、このままIIS上に配置した場合、デフォルトでは拡張子がtxtとかhtmlの場合はASP.NET側に処理が渡されませんので、b.txtでは絶対にApplication_AcquireRequestStateなんてイベントは発生しません。
このあたり、開発サーバとIISの動作の違いになります。

b.aspxでApplication_AcquireRequestStateイベントがあがってこなかったのはファイルが存在しないせいかなぁ。。。
そんなこと試したこともないのですが、そのせいじゃないか、ぐらいしか思いつかない。
未記入
ベテラン
会議室デビュー日: 2008/01/15
投稿数: 65
投稿日時: 2008-03-26 17:12
引用:

どっとねっとふぁんさんの書き込み (2008-03-26 16:32) より:
ふむ、iframeの内部ソースということだと、a.aspxとb.txtは並行して動作しますから、セッション情報が設定されてるかどうかは必ずしも確定しませんね。
一番の問題はそこでしょうね。



まずa.aspxがクライアントに返り、クライアントからb.txtを要求するという流れになると思っていたのですが違うのでしょうか?
このシーケンスならセッション情報は確定していますので問題ないと思っていました。
もしかしてこのシーケンスにするならframesetを使わないといけないのでしょうか?

引用:

どうしてもそのような動きをさせたい、ということなら、a.aspxでJavaScriptを利用してページのロードが終わったことを確認してからb.txtをiframeのソースとして設定するとかいった動作をさせることになるかなぁ。



この動きに興味があるのですが、参考情報があれば教えてください

引用:

ちなみに、デバッガーといっているので開発サーバ上で確認作業をしているものと思われますが、このままIIS上に配置した場合、デフォルトでは拡張子がtxtとかhtmlの場合はASP.NET側に処理が渡されませんので、b.txtでは絶対にApplication_AcquireRequestStateなんてイベントは発生しません。
このあたり、開発サーバとIISの動作の違いになります。



これは致命的です(泣)
ダミーのaspxファイルを要求させてセッション情報を参照したあとServer.Transferで目的のファイルに転送するという回避策ぐらいしか思いつかないのですが、他に方法は無いでしょうか?

引用:

b.aspxでApplication_AcquireRequestStateイベントがあがってこなかったのはファイルが存在しないせいかなぁ。。。
そんなこと試したこともないのですが、そのせいじゃないか、ぐらいしか思いつかない。



b.aspxを用意したところApplication_AcquireRequestState内でセッション情報を参照することが出来ました。

ここまでで分かったことを整理すると、Application_AcquireRequestStateでセッション情報を参照するには
1.拡張子はaspxにする
2.そのファイルは存在する
の2点をクリアしないと駄目だと理解しました。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-03-26 17:44
> まずa.aspxがクライアントに返り、クライアントからb.txtを要求するという流れになると思っていたのですが違うのでしょうか?

ブラウザはa.aspx内のiframeタグを解釈した時点でb.txtの要求を開始するでしょうね。
その時点でセッション情報は通常は確定しているでしょうけど、確実か?というと疑問が多少残ります。
まぁ、b.aspxを用意した時点でセッションがとれている、ということならa.aspxでへんな実装をしなければ大丈夫かも。

> この動きに興味があるのですが、参考情報があれば教えてください

以前の経験でしかありません。
間違いなくa.aspxの処理が完了していることを保証しようとするならこういう動きかな、と。

どうしても拡張子をtxtのままでApplication_AcquireRequestStateイベントでセッション情報を取得したいなら、IISのマッピングの設定を変更し、.txtであってもASP.NET側に処理が渡されるように設定してあげる必要があります。

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