WinINet と WinHTTP

いくつかの例外を除き、WinINet は WinHTTP のスーパーセットです。 2 つを選択するときは、偽装とセッション分離 を必要とするサービスまたはサービスのようなプロセス内で実行する予定がない限り、WinINetを使用する必要があります。

機能の比較

特徴 WinINet WinHTTP
資格情報キャッシュ。 Windows Internet Explorer のすべての組み込みアプリケーションが自動的に資格情報を取得できるようにします。 また、Internet Explorer の外部で実行されているアプリケーションで、サーバーの資格情報を 1 回だけプロンプトまたは指定することもできます。 それ以降、要求は自動的に行われます。 はい いいえ
資格情報の入力を求める。 呼び出し元のコードがユーザーに資格情報の入力を求める API を提供します。 はい いいえ
FTP はい いいえ
Autodial/RAS サポート。 これは従来の機能です。 代わりに、リモート アクセス 使用します。 はい いいえ
ゾーン. Internet Explorer セキュリティ ゾーンとの自動統合。 はい いいえ
IDNA はをサポートします。 IDNA RFC/Punycode の統合サポート。 はい はい
Cookie Jar API。 永続的な Cookie と非永続的な Cookie がサポートされています。 任意のアプリケーションまたはスクリプトでこれを使用して、ブラウザーと同じ Cookie を表示できます。 はい いいえ
保護モード IE のサポート はい いいえ
解凍対応。 gzip および deflate 圧縮スキームのサポート。 はい はい
チャンク アップロードのサポート。 クライアントコードでチャンク化を行う必要があります。 いいえ はい
SOCKS4 (SOCKS バージョン 4) サポート。 v4a は含まれません。 はい いいえ
SOCKS5 (SOCKS バージョン 5) サポート いいえ いいえ
双方向の送受信 いいえ いいえ
オーバーラップ I/O いいえ いいえ
ファイル スキームのサポート ファイル スキームを使用するプロキシ スクリプトに役立ちます。 はい いいえ
InternetOpenUrl。 URL を開く簡略化されたコード。 はい いいえ
サービスのサポート サービスまたはサービス アカウントから実行できます。 いいえ はい
セッション分離。 個別のセッションが互いに影響を与えるわけではありません。 いいえ はい
偽装。 スレッドが別のユーザーを偽装している間の呼び出しをサポートします。 いいえ はい

クイック デシジョン ガイド

次のフローチャートを使用して、適切な HTTP クライアント スタックを選択します。

  1. コードは、Windows サービス、システム プロセス、または偽装の下で実行されていますか?
    • はい → WinHTTP を使用します。
  2. コードは、ユーザーのインターネット オプション (IE) プロキシ設定、Cookie、または資格情報プロンプトを必要とするデスクトップ アプリですか?
    • はい→ WinINet を使用します。
  3. 最新の C++ デスクトップまたは UWP/WinUI アプリを作成していますか?
  4. .NET アプリケーションを作成していますか?
    • はい → System.Net.Http.HttpClient を使用します。
  5. クロスプラットフォームの互換性が必要ですか?
    • はい → libcurl または同様のポータブル ライブラリを使用します。

Note

WinINet と WinHTTP の両方を使用しない場合 — 新しいアプリケーションを構築していて、従来の Win32 統合を必要としない場合は、上記の最新の代替手段を使用します。 これらは、よりシンプルな API とより優れた非同期サポートを提供します。 一部の代替手段には、追加の利点もあります。たとえば、libcurl と .NET HttpClient はクロスプラットフォームであり、TLS 1.3 の可用性は基盤となる TLS スタックと OS の構成によって異なります。 Win32 サービスのサポート、ブラウザー資格情報の共有、または詳細なプロキシ統合が特に必要なシナリオでは、WinHTTP/WinINet を予約します。

Important

セキュリティアラーム — 選択した HTTP スタックに関係なく、運用環境で TLS 証明書の検証を無効にしないでください。 WinHTTP と WinINet の両方で、フラグを使用して証明書エラーを無視できますが、これを行うと、アプリケーションが中間者攻撃にさらされます。