- - PR -
Sessionオブジェクトが作られるタイミング
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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を経ることなく、ページの処理に行ってしまっています。 だから、セッションオブジェクトができていないようです。 セッションオブジェクトはどのタイミングでできるのでしょうか? また、そのタイミングをこちらで指定することはできないのでしょうか? よろしくお願いします。 | ||||
|
投稿日時: 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-04-14 18:30
動的な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を作るというのも考えましたが、 同じエラーが出ます。 | ||||
|
投稿日時: 2005-04-14 18:50
試してませんが、Response.Redirect でも駄目ですか?
| ||||
|
投稿日時: 2005-04-14 19:02
できます。 が、それだとRedirect先のURL(area.aspx?id=tokyo) というのが見えてしまいます。それを避けたいのです。 | ||||
|
投稿日時: 2005-04-14 19:25
いまいち良い方法とは思えないのですが、Response.Redirectだとうまくいくならarea.aspxのPage_Loadで、Getパラメータが指定されていたらそれをSessionに格納して自分自身(パラメータなし)にもいっかいResponse.Redirectっていうのはどうでしょう?(^^;
| ||||
|
投稿日時: 2005-04-14 19:48
syodanmallerさん、こんばんは。
ユーザに長ったらしいURLを入力させたくないからとか、そういう事ではなく、まるっきり見せたくないという事でしたか。 Session 以外では、 Cookie を使うという手もありますね。 | ||||
|
投稿日時: 2005-04-14 20:54
すばやい返信、いつもありがとうございます。
そうです、そうです。見た目にかっこ悪いからというのが主な理由です。 あと、効果があるか不明ですが、ちょっとサーチエンジン対策を意識してます。 さらにパラメータが増えた場合、この方法でパラメータの数を減らせば、 クロールの対象から外れることを防げるかな、と。 で、いろいろ探したら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"になるので、 ちゃんと動くかの確認が、かなりややこしそうです。 もちょっと、いろいろ試してみます。 |