- PR -

Sessionオブジェクトが作られるタイミング

投稿者投稿内容
ビジネスモール開発者
常連さん
会議室デビュー日: 2005/03/17
投稿数: 25
投稿日時: 2005-04-14 15:44
セッションオブジェクトについて教えてください。

global.asax.vbの、Application_BeginRequestで、
server.transferを使いました。

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' 各要求の最初に発生します。
    server.transfer("webForm1.aspx")
End Sub

すると、webForm1でセッションを使っているところでエラーになりました。
セッションオブジェクトができていないようなのです。

デバッグのウォッチで、いつ、Session.SessionIDができるのかを見てみると、
通常、Session_Startが始まるときにSessionIDができているようです。

上記のようにApplication_BeginRequestでserver.transferをすると、
Session_Startを経ることなく、ページの処理に行ってしまっています。
だから、セッションオブジェクトができていないようです。

セッションオブジェクトはどのタイミングでできるのでしょうか?
また、そのタイミングをこちらで指定することはできないのでしょうか?

よろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-04-14 16:39
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwebhttpapplicationclasstopic.asp

ここに書かれている
AcquireRequestStateでSessionStateModuleがSession情報を生成します。
Transferを使用すると、ASP.NETランタイムが行う処理がショートカットされます。
なぜwebForm1.aspxに強制的に遷移させたいのでしょうか?
ビジネスモール開発者
常連さん
会議室デビュー日: 2005/03/17
投稿数: 25
投稿日時: 2005-04-14 18:30
引用:

burton999さんの書き込み (2005-04-14 16:39) より:

なぜwebForm1.aspxに強制的に遷移させたいのでしょうか?



動的なURLを静的なURLに見せたいのです。

現在、/app/area.aspx?id=tokyo
となっているのですが、これを
/app/area/tokyo または /app/area/tokyo/area.aspx
のようにしたいのです。
(パラメータは、tokyoだけでなく、osaka,nagoya・・・とかなり多く、変更も多いので、
実ディレクトリや実ファイルは作りたくないです)

そこで、Application_BeginRequestで
/app/area/tokyo だったら /app/area.aspx?id=tokyo
にServer.Transferしようと思ったのです。

カスタムHttpHandlerを作るというのも考えましたが、
同じエラーが出ます。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-04-14 18:50
試してませんが、Response.Redirect でも駄目ですか?
ビジネスモール開発者
常連さん
会議室デビュー日: 2005/03/17
投稿数: 25
投稿日時: 2005-04-14 19:02
引用:

きくちゃんさんの書き込み (2005-04-14 18:50) より:
試してませんが、Response.Redirect でも駄目ですか?



できます。
が、それだとRedirect先のURL(area.aspx?id=tokyo)
というのが見えてしまいます。それを避けたいのです。

ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-04-14 19:25
いまいち良い方法とは思えないのですが、Response.Redirectだとうまくいくならarea.aspxのPage_Loadで、Getパラメータが指定されていたらそれをSessionに格納して自分自身(パラメータなし)にもいっかいResponse.Redirectっていうのはどうでしょう?(^^;
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-04-14 19:48
syodanmallerさん、こんばんは。

引用:

が、それだとRedirect先のURL(area.aspx?id=tokyo)
というのが見えてしまいます。それを避けたいのです。


ユーザに長ったらしいURLを入力させたくないからとか、そういう事ではなく、まるっきり見せたくないという事でしたか。

Session 以外では、 Cookie を使うという手もありますね。
ビジネスモール開発者
常連さん
会議室デビュー日: 2005/03/17
投稿数: 25
投稿日時: 2005-04-14 20:54
すばやい返信、いつもありがとうございます。

引用:

きくちゃんさんの書き込み (2005-04-14 19:48) より:

ユーザに長ったらしいURLを入力させたくないからとか、そういう事ではなく、まるっきり見せたくないという事でしたか。


そうです、そうです。見た目にかっこ悪いからというのが主な理由です。
あと、効果があるか不明ですが、ちょっとサーチエンジン対策を意識してます。
さらにパラメータが増えた場合、この方法でパラメータの数を減らせば、
クロールの対象から外れることを防げるかな、と。

で、いろいろ探したらRewritePathというのを見つけました。

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' 各要求の最初に発生します。
If (URLがapp/tokyo/area.aspxだったら) Then
Context.RewritePath("app/area.aspx?id=tokyo"))
End If
End Sub

というように、無理やりパスを書き換えることができそうです。
でも、RewritePathってこんな使い方でいいのでしょうか?

あと、受け取ったページで、
Request.RawUrlは、"app/tokyo/area.aspx"ですが、
Request.Url.toStringは、"app/area.aspx?id=tokyo"になるので、
ちゃんと動くかの確認が、かなりややこしそうです。

もちょっと、いろいろ試してみます。

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