none
GetDefaultProxy の代替えは?

    質問

  •  

    こんにちは。

    現在Webサービスを使用するコードを書いていますが、コードレビューで問題があり困った事態になっています。

    皆さんのお知恵を拝借すべく投稿しました。

    システム設定のWebプロキシを取得するために、次のような手法にてプロキシアドレスを取得しています。

     

       Dim objProxy As WebProxy = System.Net.WebProxy.GetDefaultProxy()

     

    しかし、MSDNライブラリーでは「メモ : このメソッドは,互換性のために残されています。

    となっており、本来の使い方ではない気がします。

     

    色々調査したところ

    WebRequestのDefaultWebProxyが使えるかなと試したところ、実行時にエラーとなります。

    「追加情報: 型 'WebProxyWrapper' のオブジェクトを型 'System.Net.WebProxy' にキャストできません。」

    WebRequestのGetSystemWebProxyの同様です

     

    そこで、皆さんはシステム設定のProxy情報取得方法はどのようにして行ってますか?

    検索すると情報がないので困ってます。最悪レジストリーから情報を取得する手法しか残ってないのでしょうか?

     

    ご教授の程、よろしくお願いいたします。



     

     

     

    2007年10月23日 1:49

回答

  • かっとしさん、こんにちは。

     

    GetDefaultProxy メソッドの代わりは 「ありません」 という回答になると思います。
    GetDefaultProxy メソッドは取って代わるメソッドが加わったために推奨されていないのではなく、
    将来のサポートが保証されないため、推奨されなくなったというのが真実です。

     

    .NET Framework 2.0 で廃止予定の型とメンバの一覧 (アセンブリ単位) からの引用

     

    GetDefaultProxy()

    メッセージ : このメソッドは非推奨になりました。既定で選択されるプロキシを使用してください。

     

    だそうです。

    2007年10月23日 3:20
  • そこで、皆さんはシステム設定のProxy情報取得方法はどのようにして行ってますか?

    .Netはシステムを設定するためのフレームワークではなく、

    アプリケーションを組むためのフレームワークですので、

    システム設定を隠蔽するようにできています。

    つまり、基本的にシステム設定のProxy情報は取得しないように作るべきだということです。

     

    となっており、本来の使い方ではない気がします。

    ここで本来の使い方でないことを気にするのでしたら、

    システムのProxy情報を取らなければいけないということ自体を気にするべきです。

     

    ところで。

    WebRequestのDefaultWebProxyが使えるかなと試したところ、実行時にエラーとなります。

    DefaultWebProxyはSystem.Net.WebProxyではなく、System.Net.IWebProxyです。

    IWebProxy型で受ければ使えます。

    もちろん、GetSystemWebProxyも同様に使えます。

    ここからプロキシのURIを取得できます。

     

    最近はDHCPやDNS、無線LANの接続のロケーション設定(正しくなんというのか知りません)によって

    動的にProxyが変更されることがあります。

    GetDefaultProxyはこれに対応していません。

     

    DefaultWebProxyやGetSystemWebProxyで用いられているIWebProxy型は

    WebProxy型に比べ抽象度が高いため、これらにも対応できます。

    ですので、GetDefaultProxyが非推奨になったようです。

     

    動的構成によるプロキシは、

    IWebProxyなら確実に実装できますが、

    WebProxy型を実装できるとは限らないわけです。

     

    見ればばわかりますが、IWebProxyはプロキシとして必要十分条件なメンバのみでできています。

    IWebProxyを自分で実装したり、OS標準のものを用いたり、

    実際の実装を他に任せることで、様々なプロキシを、様々なクラスから利用できるわけです。

     

    ちなみに、現状ではGetSystemWebProxyの返すIWebProxyはWebProxyのラッパーです。

    ですので、リフレクションを駆使したりすればGetSystemWebProxyからWebProxyが取れます。

    詳しくは知りませんが、CompactFrameworkだったりすると違うのかもしれません。

    そうゆう無理なことをするくらいならGetDefaultProxyを使うべきだと思いますが。

    2007年10月23日 3:56
  • じゃぬネットさま、れいさま回答ありがとうございます

    私はコントロールパネルのインターネットのプロパティで設定する接続タブ中の「ローカルエリアネットワークの設定」を取得したかったのです。

     

    私の言葉「本来の使い方ではない」と言うのは、他にフレームワークのプロパティやメソッドで取得できるのかな?と考えてこの言葉を選択しました。誤解を生んだようで申し訳ございません。

     

    れいさまの回答

    >Netはシステムを設定するためのフレームワークではなく、

    >アプリケーションを組むためのフレームワークですので、

    >システム設定を隠蔽するようにできています。

    >つまり、基本的にシステム設定のProxy情報は取得しないように作るべきだということです。

    >

    となっており、本来の使い方ではない気がします。

    >ここで本来の使い方でないことを気にするのでしたら、

    >システムのProxy情報を取らなければいけないということ自体を気にするべきです

     

    確にその通りですが、「コントロールパネルで設定しているのだからこれを使う」と言った要求があり、システムのProxy情報を取得する事は必須条件となっております。
     
    実行時エラーに関しての説明もありがとうございました。
     
    Googleで検索すると、GetDefaultProxyのある条件ではコントロールパネルで設定した情報が取得できない様です。
    結論としては、IWebProxyを継承したWebProxy相当の実装を自分で作らなきゃならないみたいですね。
     
    ガンバリマス
    2007年10月23日 10:49
  • 結論としては、IWebProxyを継承したWebProxy相当の実装を自分で作らなきゃならないみたいですね。

    私の読解力が足りないだけかもしれませんが、

    たぶんその結論は間違っています。

     

    #いやむしろ説明力が足りないのか?

     

    確にその通りですが、「コントロールパネルで設定しているのだからこれを使う」と言った要求があり、システムのProxy情報を取得する事は必須条件となっております。

    この文章が私にはよく理解できないのですが

    ・「システムのプロキシ設定情報を表示したり設定したい」

    ・「システムのプロキシ設定情報を利用してWebアクセスを行う」

    のどちらを行いたいのでしょうか?両方?

     

    前者であったとするなら、

    システムのプロキシ設定情報を表示したり、変更したりしたい場合は、WebProxyは関係ありません。

    レジストリにアクセスするだけで設定を読んだり、変更できます。

    ですので、WebProxyを作る必要はありません。

     

    後者であった場合、

    WebRequestの派生クラスであれば、

    自動的にシステムのプロキシ情報を用いてアクセスします。

    WebRequestの派生クラスでないクラス、Socketなどを用いてWebアクセスしたい場合でも、

    WebRequestからDefaultWebProxyを取得し、

    これを用いればシステムのプロキシを用いてWebアクセスすることが可能です。

    ですので、やはりIWebProxyの実装を作る必要はありません。

     

    もちろん、前者後者両方とも行いたい場合も、IWebProxyを作る必要はありません。

     

    IWebProxyの実装を作る必要はあまりありません。

    WebRequestクラスを用いてWebアクセスしたい場合に

    これのプロキシを独自実装のものに変更したい場合には作る必要があります。

    それ以外では殆ど使わないと思います。

    2007年10月24日 0:53
  • れいさま、回答ありがとうございます。

     

    やりたいことは「システムのプロキシ設定情報を利用してWebアクセスを行う」です。

     

    >WebRequestの派生クラスであれば、

    >自動的にシステムのプロキシ情報を用いてアクセスします。

    調査不足でした。

    目から鱗とはまさにこの事で、大変な思いをせずに済みそうです。

    色々テストパターンを作成し、検証したいと思います。

     

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

     

    2007年10月24日 9:44

すべての返信

  • かっとしさん、こんにちは。

     

    GetDefaultProxy メソッドの代わりは 「ありません」 という回答になると思います。
    GetDefaultProxy メソッドは取って代わるメソッドが加わったために推奨されていないのではなく、
    将来のサポートが保証されないため、推奨されなくなったというのが真実です。

     

    .NET Framework 2.0 で廃止予定の型とメンバの一覧 (アセンブリ単位) からの引用

     

    GetDefaultProxy()

    メッセージ : このメソッドは非推奨になりました。既定で選択されるプロキシを使用してください。

     

    だそうです。

    2007年10月23日 3:20
  • そこで、皆さんはシステム設定のProxy情報取得方法はどのようにして行ってますか?

    .Netはシステムを設定するためのフレームワークではなく、

    アプリケーションを組むためのフレームワークですので、

    システム設定を隠蔽するようにできています。

    つまり、基本的にシステム設定のProxy情報は取得しないように作るべきだということです。

     

    となっており、本来の使い方ではない気がします。

    ここで本来の使い方でないことを気にするのでしたら、

    システムのProxy情報を取らなければいけないということ自体を気にするべきです。

     

    ところで。

    WebRequestのDefaultWebProxyが使えるかなと試したところ、実行時にエラーとなります。

    DefaultWebProxyはSystem.Net.WebProxyではなく、System.Net.IWebProxyです。

    IWebProxy型で受ければ使えます。

    もちろん、GetSystemWebProxyも同様に使えます。

    ここからプロキシのURIを取得できます。

     

    最近はDHCPやDNS、無線LANの接続のロケーション設定(正しくなんというのか知りません)によって

    動的にProxyが変更されることがあります。

    GetDefaultProxyはこれに対応していません。

     

    DefaultWebProxyやGetSystemWebProxyで用いられているIWebProxy型は

    WebProxy型に比べ抽象度が高いため、これらにも対応できます。

    ですので、GetDefaultProxyが非推奨になったようです。

     

    動的構成によるプロキシは、

    IWebProxyなら確実に実装できますが、

    WebProxy型を実装できるとは限らないわけです。

     

    見ればばわかりますが、IWebProxyはプロキシとして必要十分条件なメンバのみでできています。

    IWebProxyを自分で実装したり、OS標準のものを用いたり、

    実際の実装を他に任せることで、様々なプロキシを、様々なクラスから利用できるわけです。

     

    ちなみに、現状ではGetSystemWebProxyの返すIWebProxyはWebProxyのラッパーです。

    ですので、リフレクションを駆使したりすればGetSystemWebProxyからWebProxyが取れます。

    詳しくは知りませんが、CompactFrameworkだったりすると違うのかもしれません。

    そうゆう無理なことをするくらいならGetDefaultProxyを使うべきだと思いますが。

    2007年10月23日 3:56
  • じゃぬネットさま、れいさま回答ありがとうございます

    私はコントロールパネルのインターネットのプロパティで設定する接続タブ中の「ローカルエリアネットワークの設定」を取得したかったのです。

     

    私の言葉「本来の使い方ではない」と言うのは、他にフレームワークのプロパティやメソッドで取得できるのかな?と考えてこの言葉を選択しました。誤解を生んだようで申し訳ございません。

     

    れいさまの回答

    >Netはシステムを設定するためのフレームワークではなく、

    >アプリケーションを組むためのフレームワークですので、

    >システム設定を隠蔽するようにできています。

    >つまり、基本的にシステム設定のProxy情報は取得しないように作るべきだということです。

    >

    となっており、本来の使い方ではない気がします。

    >ここで本来の使い方でないことを気にするのでしたら、

    >システムのProxy情報を取らなければいけないということ自体を気にするべきです

     

    確にその通りですが、「コントロールパネルで設定しているのだからこれを使う」と言った要求があり、システムのProxy情報を取得する事は必須条件となっております。
     
    実行時エラーに関しての説明もありがとうございました。
     
    Googleで検索すると、GetDefaultProxyのある条件ではコントロールパネルで設定した情報が取得できない様です。
    結論としては、IWebProxyを継承したWebProxy相当の実装を自分で作らなきゃならないみたいですね。
     
    ガンバリマス
    2007年10月23日 10:49
  • 結論としては、IWebProxyを継承したWebProxy相当の実装を自分で作らなきゃならないみたいですね。

    私の読解力が足りないだけかもしれませんが、

    たぶんその結論は間違っています。

     

    #いやむしろ説明力が足りないのか?

     

    確にその通りですが、「コントロールパネルで設定しているのだからこれを使う」と言った要求があり、システムのProxy情報を取得する事は必須条件となっております。

    この文章が私にはよく理解できないのですが

    ・「システムのプロキシ設定情報を表示したり設定したい」

    ・「システムのプロキシ設定情報を利用してWebアクセスを行う」

    のどちらを行いたいのでしょうか?両方?

     

    前者であったとするなら、

    システムのプロキシ設定情報を表示したり、変更したりしたい場合は、WebProxyは関係ありません。

    レジストリにアクセスするだけで設定を読んだり、変更できます。

    ですので、WebProxyを作る必要はありません。

     

    後者であった場合、

    WebRequestの派生クラスであれば、

    自動的にシステムのプロキシ情報を用いてアクセスします。

    WebRequestの派生クラスでないクラス、Socketなどを用いてWebアクセスしたい場合でも、

    WebRequestからDefaultWebProxyを取得し、

    これを用いればシステムのプロキシを用いてWebアクセスすることが可能です。

    ですので、やはりIWebProxyの実装を作る必要はありません。

     

    もちろん、前者後者両方とも行いたい場合も、IWebProxyを作る必要はありません。

     

    IWebProxyの実装を作る必要はあまりありません。

    WebRequestクラスを用いてWebアクセスしたい場合に

    これのプロキシを独自実装のものに変更したい場合には作る必要があります。

    それ以外では殆ど使わないと思います。

    2007年10月24日 0:53
  • れいさま、回答ありがとうございます。

     

    やりたいことは「システムのプロキシ設定情報を利用してWebアクセスを行う」です。

     

    >WebRequestの派生クラスであれば、

    >自動的にシステムのプロキシ情報を用いてアクセスします。

    調査不足でした。

    目から鱗とはまさにこの事で、大変な思いをせずに済みそうです。

    色々テストパターンを作成し、検証したいと思います。

     

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

     

    2007年10月24日 9:44