none
C#でプロキシを作成しています RRS feed

回答

  • プロクシとしてアクセスする場合、IP アドレスでプロクシにリクエストするので、プロクシを localhost:8082 と設定した場合実際には 127.0.0.1:8082 にリクエストされるが、Prefixes.Add("http://localhost:8082/") として登録した場合あくまで「localhost:8082」であって「127.0.0.1:8082」ではないので HttpListener は自分宛のリクエストだと認めない(自分へのアクセスなのに登録されてないアドレスだからエラー)、って感じでしょうかね。localhost:8082 を登録して http://127.0.0.1:8082 に直接リクエストしても 400 が返ってくるし。

    リンク先では、そもそも Prefixes.Add する IP アドレスには IPAddress.Loopback を使ってますよね?(その場合、登録には管理者権限 / UAC 昇格が必要みたいですけど)

    • 回答としてマーク 山本春海 2010年8月2日 2:58
    2010年7月21日 14:23
  • Hongliang さんの回答で十分と感じていたのでスルーしていました。

    LAN内で使用するアドレス全てを登録しなければいけないのでしょうか?

    意図がよくわかりません。
    Listener なのですから、宛先を登録するのではなく、自分の待ち受けアドレス(あるいはホスト名)を登録するはずですよね?
    「LAN 内で使用するアドレス全てを登録」という風になるのが不思議なのですが…。

    また、CL内で動くPGのためlocalhostで問題ないと考えていますが問題ないのでしょうか?

    CL って何でしょうか?
    「同じマシンで動くプログラムだから」という理由であれば、Hongliang さんが否定していますよね。
    「localhost を Prefixes に登録して 127.0.0.1 にアクセスしても拒否された」という旨がすでに書かれています。

    なお、http://localhost/ への直接のアクセスであれば、HTTP で localhost = 127.0.0.1 に接続し、HTTP ヘッダーにて localhost というホスト名でアクセスしたことを通知します。
    これによって、http://localhost/ にアクセスされたことを HtppListener が検証可能なのでしょう。

    プロキシとして設定・接続した場合、localhost というホスト名は通知しません。
    単純に 127.0.0.1 にアクセスするだけなので、http://localhost/ で登録している HttpListener は自分へのアクセスと認識しないのでしょう。
    従って、localhost では問題があると考えられます。

    -----
    私自身は HttpListener を使ったことがありませんが、Hongliang さんの回答と、HttpListener クラスの説明を軽く読んで、知っている HTTP の仕組みを踏まえてこのように考えました。
    http://msdn.microsoft.com/ja-jp/library/system.net.httplistener.aspx


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 山本春海 2010年8月2日 2:58
    2010年7月28日 14:17
    モデレータ
  • 結局のところ、127.0.0.1 で登録する、HttpListener クラスの説明にあるようなホスト名の代わりの文字を使うぐらいしかないのでは?
    (必要なのであれば、管理者権限で実行するしかないかもしれませんね)
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 山本春海 2010年8月2日 2:58
    2010年7月28日 14:20
    モデレータ

すべての返信

  • listener.Prefixes.Add="http://localhost:8082 "
    プロキシの設定でlocalhost:8080を設定してます。
    8082 番ポートをリスニングしてるのに 8080 番ポートをプロクシに指定していてはそりゃダメだと思いますが。
    2010年7月21日 12:36
  • すいません間違えました

    8082にしてます

    2010年7月21日 13:04
  • プロクシとしてアクセスする場合、IP アドレスでプロクシにリクエストするので、プロクシを localhost:8082 と設定した場合実際には 127.0.0.1:8082 にリクエストされるが、Prefixes.Add("http://localhost:8082/") として登録した場合あくまで「localhost:8082」であって「127.0.0.1:8082」ではないので HttpListener は自分宛のリクエストだと認めない(自分へのアクセスなのに登録されてないアドレスだからエラー)、って感じでしょうかね。localhost:8082 を登録して http://127.0.0.1:8082 に直接リクエストしても 400 が返ってくるし。

    リンク先では、そもそも Prefixes.Add する IP アドレスには IPAddress.Loopback を使ってますよね?(その場合、登録には管理者権限 / UAC 昇格が必要みたいですけど)

    • 回答としてマーク 山本春海 2010年8月2日 2:58
    2010年7月21日 14:23
  • そもそも
    このPGを常駐させて
    ユーザーが
    あるアドレスを表示させようとした場合
    特定のサーバに飛ばし、
    関係が無いアドレスであれば
    IEで設定されているプロキシに飛ばす。
    という実行体を作成したいと考えています。

    LAN内で使用するアドレス全てを登録しなければいけないのでしょうか?


    ※UAC有効環境(Vista、7)で、HttpListenerExceptionが発生する仕様のようなので
    localhostを指定しています。

    また、CL内で動くPGのためlocalhostで問題ないと考えていますが
    問題ないのでしょうか?
    2010年7月22日 0:07
  • どなたかわかりませんか?
    2010年7月28日 9:41
  • Hongliang さんの回答で十分と感じていたのでスルーしていました。

    LAN内で使用するアドレス全てを登録しなければいけないのでしょうか?

    意図がよくわかりません。
    Listener なのですから、宛先を登録するのではなく、自分の待ち受けアドレス(あるいはホスト名)を登録するはずですよね?
    「LAN 内で使用するアドレス全てを登録」という風になるのが不思議なのですが…。

    また、CL内で動くPGのためlocalhostで問題ないと考えていますが問題ないのでしょうか?

    CL って何でしょうか?
    「同じマシンで動くプログラムだから」という理由であれば、Hongliang さんが否定していますよね。
    「localhost を Prefixes に登録して 127.0.0.1 にアクセスしても拒否された」という旨がすでに書かれています。

    なお、http://localhost/ への直接のアクセスであれば、HTTP で localhost = 127.0.0.1 に接続し、HTTP ヘッダーにて localhost というホスト名でアクセスしたことを通知します。
    これによって、http://localhost/ にアクセスされたことを HtppListener が検証可能なのでしょう。

    プロキシとして設定・接続した場合、localhost というホスト名は通知しません。
    単純に 127.0.0.1 にアクセスするだけなので、http://localhost/ で登録している HttpListener は自分へのアクセスと認識しないのでしょう。
    従って、localhost では問題があると考えられます。

    -----
    私自身は HttpListener を使ったことがありませんが、Hongliang さんの回答と、HttpListener クラスの説明を軽く読んで、知っている HTTP の仕組みを踏まえてこのように考えました。
    http://msdn.microsoft.com/ja-jp/library/system.net.httplistener.aspx


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 山本春海 2010年8月2日 2:58
    2010年7月28日 14:17
    モデレータ
  • 結局のところ、127.0.0.1 で登録する、HttpListener クラスの説明にあるようなホスト名の代わりの文字を使うぐらいしかないのでは?
    (必要なのであれば、管理者権限で実行するしかないかもしれませんね)
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 山本春海 2010年8月2日 2:58
    2010年7月28日 14:20
    モデレータ
  • 勘違いしていました

     

    ありがとうございます。

    2010年7月30日 4:16
  • こんにちは、chouchou777777 さん。

    MSDN フォーラムのご利用ありがとうございます。フォーラム オペレーターの 山本です。

    Hongliang さんや、Azulean さんからの情報が有効であったかと思われますので、勝手ながら私のほうで回答としてマークさせていただきました。
    Hongliang さん、Azulean さん、アドバイスありがとうございます。

    回答としてマークすることで、今後同じ問題でこのスレッドを参照された方の目にも、有効な情報が目にとまりやすくなりますので、解決に役立った情報や参考になる情報などには、回答としてマークすることをお願いしています。
    次回から chouchou777777 さんも、回答としてマークをしてみてくださいね。

    今後とも、MSDN フォーラムをよろしくお願いいたします。それでは。
                                                         
    マイクロソフト株式会社 フォーラム オペレーター 山本 春海
    2010年8月2日 3:04