none
#で区切られたQueryStringの取得 RRS feed

  • 質問

  • 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 なども試してみましたが、取得できませんでした。

    この#以降を取得する方法はありますでしょうか。

    2018年3月15日 9:11

回答

  • > 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
    2018年3月16日 1:14
  • > 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 のボディ部に渡して処理するなどといった、追加の作業が必要になります。


    2018年3月16日 1:16

すべての返信

  • > この記事を参考にAsp.netでWebアプリケーションを作成しています。

    その記事を読むのは負担が大きすぎます。たぶん自分だけでなく他の閲覧者の方にも。

    読まずに回答しますので、悪しからずご了解ください。

    > http://localhost/test.php#access_token=eyJ0eXAiOi...&token_type=Bearer&expires_in=3599&session_state...>
    > というURLにリダイレクトされるので、リダイレクトされたページでaccess_tokenを受け取れ、とあるのですが、

    その時の応答ヘッダをコピペしてここに書いてください。そうしていただければ、記事を読まなくても回答できるかもしれません。

    2018年3月15日 10:36
  • 分かりにくくて申し訳ありません。

    やりたいことは単純なことで、

    http://localhost/test.aspx#access_token=xxxxx

    という形で、区切りが?ではなく#でQueryStringの部分がリクエストで飛んでくるので、

    #以降を取得する方法はあるかを質問したかったのです。

    記事を参照していただく必要は無く、ただ仕様としてそういう形で飛んできてしまうので、飛ばしてくる側を変更するというのが無理ということだけです。



    • 編集済み yiwamoto 2018年3月16日 1:17
    2018年3月16日 0:48
  • > 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
    2018年3月16日 1:14
  • > 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 のボディ部に渡して処理するなどといった、追加の作業が必要になります。


    2018年3月16日 1:16
  • 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 立花楓

    2018年3月16日 2:02
    モデレータ
  • たいへん勉強になりました。

    ありがとうございました。

    2018年3月16日 2:46