- PR -

モバイルサイトフォーム送信のクエリ付加について

1
投稿者投稿内容
isalpha
会議室デビュー日: 2007/11/02
投稿数: 3
投稿日時: 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時にクエリを付加する方法などはありませんでしょうか?
ご存知の方がいらっしゃいましたら、よろしくお願い致します。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-11-02 19:38
「サイト」を作っているのですよね。
「サーバへ渡すアドレス」の「サーバ」はisalphaさんが作っているサイトのことですよね。
IDをつける必要があるのはなぜですか?(渡されたIDを何に使うのか)

(詳しくないけど)URL書き換えをやるか、
Global.asaxでBeginRequestで捕まえるか、とかですかね。
isalpha
会議室デビュー日: 2007/11/02
投稿数: 3
投稿日時: 2007-11-02 20:20
べるさんありがとうございます。

IDは、負荷分散のサーバ振り分けの為に使います。
セッションを使っている為、2度目以降のリクエストが別のサーバに振り分けられることを防ぐ為です。
セッションIDによる自動振り分けができない機器らしく、今回のようなIDをアドレスに付加する形となりました。

ユーザがサーバへ送信する前(分散サーバにたどり着く前)の段階でのクエリ追加となると、
FormのActionにその値を埋め込むか、GETで送信する方法しか思い浮かばないのですが、
他に何か良い方法などありますでしょうか?
(Global.asaxやURL書き換えは、おそらくIISサーバ側での処理になってしまいますよね?)
前者の方法で、これがPostBackが起きる仕様になれば(Actionで設定した値が「追加」される形になるのであれば)、それで良かったのですが、思い通りにはいきませんでした。

やはり難しいでしょうかね…。
(むしろ.NETでどうにかするべき処理ではない気もしているわけですが…)
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-11-02 20:20
引用:

isalphaさんの書き込み (2007-11-02 17:18) より:
いつもこちらを参考にさせていただいております。
現在、C#(2005)でモバイル用のサイトを作成しているのですが、
サーバへ渡すアドレスに毎回必ずIDを付ける必要がある、という仕様が
突然浮かび上がってきました。


できたら、この仕様を再検討されることをお勧めします。

引用:

isalphaさんの書き込み (2007-11-02 17:18) より:
1.Form.Actionプロパティに「?SID=sv1」を設定する


私も10年以上疑問に思っているのですが、確信は持てないものの、これは反則の HTML だと思います。したがって、もしこれでなんらかの動作ができたとしても、使わないほうが良いと思います。

もし、やるとしたら、URL書き換えの一種になると思いますが、見栄えとしては、
http://example.com/SIDsv1page2/
のような感じの URL になるようにするのが一般的だろうと思います。たぶん、実現性のあるやりかたは、おそらくこの方法しかないのではないか、と思います。

ただ、エンコーディングや、API をどう呼べば良いのかは知らないです。ISAPI Filter を作るなどすれば良いのかもしれませんが。
ASP.NET の SessionID の持ち方もこれと同じだったと思います(cookie を使わない場合)。
全部、Session でやってしまえば、それがそのまま使えますので、別にIDを自分で付与する必要もないと思います。やはりIDを付与する必要がなぜあるのかを、再検討されることをお勧めします。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
isalpha
会議室デビュー日: 2007/11/02
投稿数: 3
投稿日時: 2007-11-02 21:35
unibonさんもご回答ありがとうございます。

> http://example.com/SIDsv1page2/

確かにこのような形にするのがベストですよね。
私の方も、あくまでクエリパラメータとしてIDを渡す必要性について疑問に思ったのですが、
そういう仕様で既に設定をしてしまっていると言われれば、それに従うしかなく…(涙)

今回割り振るIDは、上記でも述べておりますように、分散サーバ側で認識するサーバの識別子となります。
(初回に割り振られたサーバ毎に固定の値です)
http://example.com/SIDsv1/example.asp?page=2
ひとまず、最低、サーバ毎(仮想ディレクトリの設定?)でこのような形のURLにして、分散サーバ側で認識してもらえないかどうか確認してみたいと思います。
(.NET的な解決ができず、すみません;)
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-11-04 22:24
引用:

unibonさんの書き込み (2007-11-02 20:20) より:
引用:

isalphaさんの書き込み (2007-11-02 17:18) より:
1.Form.Actionプロパティに「?SID=sv1」を設定する


私も10年以上疑問に思っているのですが、確信は持てないものの、これは反則の HTML だと思います。したがって、もしこれでなんらかの動作ができたとしても、使わないほうが良いと思います。



反則である、とは言えないと思います。

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年間で仕様も実装もいろいろ変わってます。
昔は動かないクライアントもありましたが、
最近は前者で全部動いていると思います。

引用:

> http://example.com/SIDsv1page2/

確かにこのような形にするのがベストですよね。
私の方も、あくまでクエリパラメータとしてIDを渡す必要性について疑問に思ったのですが、
そういう仕様で既に設定をしてしまっていると言われれば、それに従うしかなく…(涙)



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

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