- - PR -
モバイルサイトフォーム送信のクエリ付加について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-11-02 17:18
いつもこちらを参考にさせていただいております。
現在、C#(2005)でモバイル用のサイトを作成しているのですが、 サーバへ渡すアドレスに毎回必ずIDを付ける必要がある、という仕様が 突然浮かび上がってきました。 例) 「http://www.〜.jp?SID=sv1」 「http://www.〜.jp?SID=sv1&page=2」 「http://www.〜.jp?page=2&SID=sv1&」 ※他のクエリパラメータとの順番関係は上記のうちどれになっても問題無い このような仕様をASP.NETで実装する際、 リンク等で画面を遷移する場合やResponse.Redirectを使う場合は、最悪、 手動で全てのURLの末尾にIDを付加する方法で対応できるのですが、 フォームのボタンをクリックする時にデータを送信する時にどうすればよいか悩んでいます。 (今回はモバイルサイトということでJavaScriptの使用は避けております) 今までに考えた手段は以下の2つです。 1.Form.Actionプロパティに「?SID=sv1」を設定する 一見、希望どおりの動作をしているように見えますが、これではPostBackをしなくなります。 この方法でも、Request.Params["コントロールID"]やRequest.Form["コントロールID"]で コントロールの値を取得する等のことはできますが、 既にコーディングがほぼ完了している状態ですので、 このような変更はなるべく避けたい所です。 2.Form.MethodのプロパティをPOSTではなくGETに指定する <input type="hidden" name="SID" value="sv1" />でSIDを付加することは可能。 しかし、当然ながら他のパラメータも付加される為、 URLの長さが推奨値(255Byte?)を余裕で超えてしまいます。 どちらも微妙に使うことができず、他の手段についても調査中ですが、 毎回、アドレスにID付きでサーバとのやり取りが行える設定や方法、 もしくはPOST時にクエリを付加する方法などはありませんでしょうか? ご存知の方がいらっしゃいましたら、よろしくお願い致します。 | ||||||||||||
|
投稿日時: 2007-11-02 19:38
「サイト」を作っているのですよね。
「サーバへ渡すアドレス」の「サーバ」はisalphaさんが作っているサイトのことですよね。 IDをつける必要があるのはなぜですか?(渡されたIDを何に使うのか) (詳しくないけど)URL書き換えをやるか、 Global.asaxでBeginRequestで捕まえるか、とかですかね。 | ||||||||||||
|
投稿日時: 2007-11-02 20:20
べるさんありがとうございます。
IDは、負荷分散のサーバ振り分けの為に使います。 セッションを使っている為、2度目以降のリクエストが別のサーバに振り分けられることを防ぐ為です。 セッションIDによる自動振り分けができない機器らしく、今回のようなIDをアドレスに付加する形となりました。 ユーザがサーバへ送信する前(分散サーバにたどり着く前)の段階でのクエリ追加となると、 FormのActionにその値を埋め込むか、GETで送信する方法しか思い浮かばないのですが、 他に何か良い方法などありますでしょうか? (Global.asaxやURL書き換えは、おそらくIISサーバ側での処理になってしまいますよね?) 前者の方法で、これがPostBackが起きる仕様になれば(Actionで設定した値が「追加」される形になるのであれば)、それで良かったのですが、思い通りにはいきませんでした。 やはり難しいでしょうかね…。 (むしろ.NETでどうにかするべき処理ではない気もしているわけですが…) | ||||||||||||
|
投稿日時: 2007-11-02 20:20
できたら、この仕様を再検討されることをお勧めします。
私も10年以上疑問に思っているのですが、確信は持てないものの、これは反則の HTML だと思います。したがって、もしこれでなんらかの動作ができたとしても、使わないほうが良いと思います。 もし、やるとしたら、URL書き換えの一種になると思いますが、見栄えとしては、 http://example.com/SIDsv1page2/ のような感じの URL になるようにするのが一般的だろうと思います。たぶん、実現性のあるやりかたは、おそらくこの方法しかないのではないか、と思います。 ただ、エンコーディングや、API をどう呼べば良いのかは知らないです。ISAPI Filter を作るなどすれば良いのかもしれませんが。 ASP.NET の SessionID の持ち方もこれと同じだったと思います(cookie を使わない場合)。 全部、Session でやってしまえば、それがそのまま使えますので、別にIDを自分で付与する必要もないと思います。やはりIDを付与する必要がなぜあるのかを、再検討されることをお勧めします。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||||||
|
投稿日時: 2007-11-02 21:35
unibonさんもご回答ありがとうございます。
> http://example.com/SIDsv1page2/ 確かにこのような形にするのがベストですよね。 私の方も、あくまでクエリパラメータとしてIDを渡す必要性について疑問に思ったのですが、 そういう仕様で既に設定をしてしまっていると言われれば、それに従うしかなく…(涙) 今回割り振るIDは、上記でも述べておりますように、分散サーバ側で認識するサーバの識別子となります。 (初回に割り振られたサーバ毎に固定の値です) http://example.com/SIDsv1/example.asp?page=2 ひとまず、最低、サーバ毎(仮想ディレクトリの設定?)でこのような形のURLにして、分散サーバ側で認識してもらえないかどうか確認してみたいと思います。 (.NET的な解決ができず、すみません;) | ||||||||||||
|
投稿日時: 2007-11-04 22:24
反則である、とは言えないと思います。 html4.01の仕様を見ればわかりますが、POSTでは何の問題もありません。 QueryのついたURIでFormが動いてはいけないとは どこにも書いていませんし、実際に動きます。 htmlは最新の4.01でも1999年ですから、 URI周りの説明が貧弱で、 GETの場合はQueryの解釈が問題になります。 action="http://example.com/path/form?mofumofu" のような場合に、他のデータをQueryに埋め込む方法として、 http://example.com/path/file?mofumofu&key1=value1 となるのか、 http://example.com/path/file?mofumofu?key1=value1 となるのかが問題です。 仕様を文面どおりに取るなら後者ですが、 意味を汲み取るなら前者となります。 10年間で仕様も実装もいろいろ変わってます。 昔は動かないクライアントもありましたが、 最近は前者で全部動いていると思います。
queryを使うかpathを使うかですが、 URIの仕様にも書かれている通り、 pathは階層的な情報を保持するために、 queryはpathに関連した非階層的情報を保持するために使います。 IDの必要性そのものは知りませんが、 本当に必要であるならば、 非階層的情報であるSIDとPageをQueryに埋め込むというのは URIの使用法として正しいと思います。 もしPathに埋め込むなら http://example.com/sv1/2/ http://example.com/2/sv1/ http://example.com/sidsv1/page2/ http://example.com/page2/sidsv1/ というように階層的に埋め込むべきですが、変ですよね。 |
1