トップ回答者
#で区切られたQueryStringの取得

質問
-
https://tsmatz.wordpress.com/2013/03/26/lync-ucwa-unified-communications-web-api/
この記事を参考にAsp.netでWebアプリケーションを作成しています。
途中
http://localhost/test.php#access_token=eyJ0eXAiOi...&token_type=Bearer&expires_in=3599&session_state=...
というURLにリダイレクトされるので、リダイレクトされたページでaccess_tokenを受け取れ、とあるのですが、
通常?で区切られるはずのところが#で区切られているためにRequest.QueryStringで値を取得できません。
Url.AbsoluteUri やUrl.OriginalString なども試してみましたが、取得できませんでした。
この#以降を取得する方法はありますでしょうか。
回答
-
> http://localhost/test.asp#access_token=xxxxx
> という形で、区切りが?ではなく#でQueryStringの部分がリクエストで飛んでくるので、フラグメントというのはご存知ですか?
URL の # の右にある文字列(上の例で言うと access_token=xxxxx)は Query String ではなくフラグメントです。
なので「飛んでくる」ということはあり得ない(ブラウザはフラグメントを送信しません)ので、サーバー側では取得できません。
何らかの手段でブラウザ側でフラグメントの部分の文字列を取得できれば、何らかの手段でそれをサーバーに送信できるかもしれません。
でも、HTTP 302 応答に対する GET 要求でそれを行うのは難しそうですね。
なんにせよ、そのあたりは ASP.NET の話ではないはずです。
- 回答としてマーク yiwamoto 2018年3月16日 2:46
-
> http://localhost/test.asp#access_token=xxxxx
最初の質問では「Asp.netでWebアプリケーション」とのことでしたが、
実際には ASP.NET ではなく ASP のアプリケーションということでしょうか。いずれにせよ ? (query 部)とは異なり、そもそもブラウザーから # (fragment 部) がサーバーに送られることはありませんので、PHP であれ ASP.NET であれ ASP であれ Servlet であれ、サーバー側で捉えることはできません。実際に HTTP リクエストヘッダーを確認してみると、下記のように #以降の無いリクエストが送出されていませんでしたか?
GET /test.asp HTTP/1.1
Host: localhostサーバー側で検知したいのであれば、クライアント側のスクリプトで window.location.hash (あるいは window.location.href) を取得して、それを UriEncode 等を施して GET リクエストを投げなおすか、あるいは ajax のボディ部に渡して処理するなどといった、追加の作業が必要になります。
- 編集済み 魔界の仮面弁士MVP 2018年3月16日 1:16
- 回答としてマーク yiwamoto 2018年3月16日 2:46
すべての返信
-
> この記事を参考にAsp.netでWebアプリケーションを作成しています。
その記事を読むのは負担が大きすぎます。たぶん自分だけでなく他の閲覧者の方にも。
読まずに回答しますので、悪しからずご了解ください。
> http://localhost/test.php#access_token=eyJ0eXAiOi...&token_type=Bearer&expires_in=3599&session_state...>
> というURLにリダイレクトされるので、リダイレクトされたページでaccess_tokenを受け取れ、とあるのですが、その時の応答ヘッダをコピペしてここに書いてください。そうしていただければ、記事を読まなくても回答できるかもしれません。
-
> http://localhost/test.asp#access_token=xxxxx
> という形で、区切りが?ではなく#でQueryStringの部分がリクエストで飛んでくるので、フラグメントというのはご存知ですか?
URL の # の右にある文字列(上の例で言うと access_token=xxxxx)は Query String ではなくフラグメントです。
なので「飛んでくる」ということはあり得ない(ブラウザはフラグメントを送信しません)ので、サーバー側では取得できません。
何らかの手段でブラウザ側でフラグメントの部分の文字列を取得できれば、何らかの手段でそれをサーバーに送信できるかもしれません。
でも、HTTP 302 応答に対する GET 要求でそれを行うのは難しそうですね。
なんにせよ、そのあたりは ASP.NET の話ではないはずです。
- 回答としてマーク yiwamoto 2018年3月16日 2:46
-
> http://localhost/test.asp#access_token=xxxxx
最初の質問では「Asp.netでWebアプリケーション」とのことでしたが、
実際には ASP.NET ではなく ASP のアプリケーションということでしょうか。いずれにせよ ? (query 部)とは異なり、そもそもブラウザーから # (fragment 部) がサーバーに送られることはありませんので、PHP であれ ASP.NET であれ ASP であれ Servlet であれ、サーバー側で捉えることはできません。実際に HTTP リクエストヘッダーを確認してみると、下記のように #以降の無いリクエストが送出されていませんでしたか?
GET /test.asp HTTP/1.1
Host: localhostサーバー側で検知したいのであれば、クライアント側のスクリプトで window.location.hash (あるいは window.location.href) を取得して、それを UriEncode 等を施して GET リクエストを投げなおすか、あるいは ajax のボディ部に渡して処理するなどといった、追加の作業が必要になります。
- 編集済み 魔界の仮面弁士MVP 2018年3月16日 1:16
- 回答としてマーク yiwamoto 2018年3月16日 2:46
-
yiwamoto さん、こんにちは。フォーラム オペレーターの立花です。
MSDN フォーラムへご投稿くださいましてありがとうございます。
ASP.NET のフォーラムに JavaScript で取得する投稿がありました。
こちらはお役に立ちますでしょうか。
how to get window.location.hash string from server side
https://forums.asp.net/t/1167104.aspx?how+to+get+window+location+hash+string+from+server+side
ご質問の主旨と異なっておりました無視してください。~ 参考になった投稿には回答としてマークの設定にご協力ください ~
MSDN/TechNet Community Support 立花楓