5

IE互換のプロキシ動作を利用したいので、WininetファミリAPIを使用して、Windows上のインターネットから単純なファイルをダウンロードするプログラムを作成しています。ご存知のように、現在の IE にはいくつかのプロキシ設定があります。自動検出 (WPAD)、自動構成 (PAC)、手動で単一の URL、プロトコルごとのプロキシ サーバー、ソックス、ダイレクトなどです。ほとんどのユーザーにとって、「直接ダウンロード」 " 正常に動作します; ただし、一部のユーザー (特にファイアウォール/NAT の背後にいるユーザー) は、接続を確立するときに常に特別なプロキシ設定が必要です。

これらすべてのケースを処理するコードを書くのは大変なので、WinINETが役に立てば幸いInternetOpen (INTERNET_OPEN_TYPE_PRECONFIG)です。ほとんどのユーザーには当てはまりますが、それでも接続障害を訴えるユーザーがいます。これらのユーザーは非常に特殊なネットワーク環境 (たとえば、プロキシにユーザー名/パスワード認証が必要) を持っている可能性があり、直接接続は機能しません。

時々、ダミーのユーザーが間違った設定をしていたので、wininet に「すべての」可能なプロキシ設定を試してもらいたいと思いました。残念ながら、INTERNET_OPEN_TYPE_PRECONFIG「可能なすべてのプロキシ設定」ではなく、ユーザーが構成したもののみが試行されます。

だから私の質問は、ダミーユーザー (つまり、システムの構成方法を理解していない) のすべての http 接続 (特にプロキシ構成) を回避する最も強力な機能を備えたプログラムを作成するにはどうすればよいかということです。プロキシを気にせずに HTTP 接続を確立するための推奨される方法はありますか? (つまり、すべての可能なプロキシ設定を試す「スーパー」接続ソルバー)、またはすべてのプロキシ設定を有効にして接続を作成するように WinINET に指示する方法がある場合は?

4

2 に答える 2

5

合理的なアルゴリズムは次のようになります。

  1. ユーザーの現在のプロキシ設定 (IE が使用するもの) を使用して接続を試みます。これらは、機能している可能性が最も高いものです。WinHttpGetIEProxyConfigForCurrentUser()これらの設定を取得するには、MSDN を参照するかINTERNET_OPEN_TYPE_PRECONFIG、WinINet を参照してください。

  2. それが失敗した場合は、直接接続を試してください。

  3. それが失敗した場合は、 WinHttpGetProxyForUrlを使用して WPAD 自動検出を試してください。( WPADは、クライアントがネットワーク (通常は企業ネットワーク) 上のProxy Auto-Config (PAC)ファイルを自動的に検索できる方法です。) プロキシ ファイルの DHCP と DNS の両方をチェックするオプションを選択する必要があります。WinHTTP AutoProxy FunctionsMSDN の には、この API を使用したコード サンプルと多くのサポート情報が含まれています。これが成功すると、HTTP ダウンロード コードにプラグインできるプロキシ情報が返されます。私の知る限り、新しい WPAD 検出を自動的に行う同等の WinINet オプションはありません。WinHTTP のみです。

  4. 次に、Firefox のプロキシ設定を探すことができます。 This SO answerは、これらの設定の場所と形式に関する詳細情報であるため、プログラムでアクセスできます。

  5. それでも失敗する場合は、(UI で) ユーザーにインターネット接続が実際に接続されていることを確認するように依頼します。実際には、上記のすべてのプロキシ検出手順が失敗するよりも、ユーザーが切断される方がはるかに一般的です。インターネット サイトにアクセスできることを確認するためにブラウザを開くようユーザーに依頼します。上記の手順が失敗した場合、ブラウザで Web を表示できない可能性があります。ユーザーが接続していると主張したら、手順 1~3 を繰り返します。

  6. 上記のすべてが失敗した場合、ユーザーにプロキシ情報を手動で指定するように依頼する以外に選択肢はほとんどありません。おそらく、IE または Firefox のプロキシ UI を複製し、それらの UI 設定を適切なパラメーターに変換して、そのファイルをダウンロードするときにプロキシ オプションを構成することをお勧めします。

プロキシ検出に魔法はないことに注意してください。選択肢は、ユーザーの設定を使用するか、デフォルトのコンピューター設定を使用するか、直接接続を使用するか、WPAD を使用して PAC ファイルを検索するか、またはユーザーに尋ねることです。残念ながら、「プロキシを気にせずに HTTP 接続を確立する」方法はありません。

ところで、WinHTTP をプロキシ検出にのみ使用し、WinINet を使用してファイルをフェッチすることもできますが、両方の部分に WinHTTP を使用することをお勧めします。HTTP インタラクションに対して最大限の柔軟性と制御が必要な場合 (および WinINet よりも優れた安定性) が必要な場合は、WinHTTP をお勧めします。

更新 2:

JJ は上で良い考えを持っていました - 私は Firefox のプロキシ設定をチェックするためのステップを追加しました。奇妙なプロキシは一般に企業環境 (IE で標準化される傾向がある) で見られるため、これが役立つ可能性はやや低くなりますが、試してみる価値はあります。

更新: Francis の正しいコメントに応えて、上記のセクションを編集しました: WinHTTP は厳密な意味で WinINet の「後継者」ではありません (WinINet の機能の 100% が WinHTTP で利用可能であることを意味します)。むしろ、WinHTTP は、データ交換に HTTP を使用し、Interet Explorer のキャッシュ、Cookie、ダイヤルアップ UI などとの統合を気にしないアプリ向けに設計されています。

サーバー アプリは間違いなくこのカテゴリに分類されます (WinINet とは異なり、WinHTTP はサーバー アプリで使用しても安全です) が、多くのクライアント ソフトウェアもこれを使用します。たとえば、最新のすべての PC の Windows Update クライアントです。一般に、WinHTTP は、HTTP 経由でファイルをダウンロードする必要があり、ネットワークをより細かく制御する必要があり、独自の UI を制御したいクライアント アプリに適しています。

WinHTTP はより実践的です (たとえば、プロキシ情報を取得するために 1 つの API 呼び出しを行い、そのプロキシ情報を使用するために別の API 呼び出しを行う必要があります)。ユーザーのプロキシ設定を無視して、新しい WPAD 検出を試みます。

于 2009-12-25T04:29:54.647 に答える
1

IE 自体が使用するプロセスについて私が見つけた最も適切な説明は、「Windows Update クライアントが Windows Update Web サイトへの接続に使用するプロキシ サーバーをどのように決定するか」にあります。IE を使用して Windows Update にアクセスするときのシーケンスと、WinINet または WinHTTP WinHttpGetIEProxyConfigForCurrentUserWinHttpDetectAutoProxyConfigUrlWinHttpGetProxyForUrl、およびWinHttpGetDefaultProxyConfigurationの知識を組み合わせて、アプリケーションを接続します。

KB記事のシーケンスは次のとおりです。

  1. ユーザーが設定を自動的に検出するように構成されている場合は、WPAD を使用して PAC ファイルを探します。
  2. PAC ファイルが見つかりませんか? ユーザーが IE 自動構成スクリプトを設定している場合は、その PAC ファイルを使用します。
  3. それでも PAC ファイルが見つかりませんか? プロキシを探します。ユーザーが手動で IE プロキシ設定を構成している場合は、それらを使用します。
  4. IE プロキシが設定されていませんか? デフォルトのプロキシ設定を確認してください。
  5. デフォルトのプロキシが設定されていませんか? 直接接続を使用してください。
于 2012-04-04T16:03:11.520 に答える