次の方法で共有


HttpClient で HTTP/3 を使用する

HTTP/3 は、HTTP の 3 番目および最近標準化されたメジャー バージョンです。 HTTP/3 では、HTTP/1.1 および HTTP/2 と同じセマンティクスを使用します。つまり、同じ要求メソッド、状態コード、メッセージ フィールドがすべてのバージョンに適用されます。 異なる点は、基になるトランスポートにあります。 HTTP/1.1 と HTTP/2 では、どちらもトランスポートとして TCP が使用されます。 HTTP/3 は 、QUIC と呼ばれる HTTP/3 と共に開発されたトランスポート テクノロジを使用します。

HTTP/3 と QUIC の両方に、HTTP/1.1 と HTTP/2 と比較していくつかの利点があります。

  • 最初の要求の応答時間が短縮されます。 QUIC と HTTP/3 は、クライアントとサーバー間のラウンド トリップを減らして接続をネゴシエートします。 最初の要求がより速くサーバーに到達します。
  • 接続パケットが失われた場合のエクスペリエンスが向上しました。 HTTP/2 では、1 つの TCP 接続を介して複数の要求が多重化されます。 接続でのパケットの損失は、すべての要求に影響します。 この問題は、"ヘッドオブライン ブロッキング" と呼ばれます。 QUIC はネイティブ多重化を提供するため、失われたパケットはデータが失われた要求にのみ影響します。
  • ネットワーク間の移行がサポートされます。 この機能は、モバイル デバイスが場所を変更する際に WIFI ネットワークと携帯ネットワークを切り替えるのが一般的なモバイル デバイスに役立ちます。 現在、ネットワークを切り替えると、HTTP/1.1 接続と HTTP/2 接続がエラーで失敗します。 アプリまたは Web ブラウザーは、失敗した HTTP 要求を再試行する必要があります。 HTTP/3 を使用すると、ネットワークが変更されたときにアプリまたは Web ブラウザーをシームレスに続行できます。 HttpClient Kestrel では、.NET 7 でのネットワーク移行はサポートされていません。 今後のリリースで利用可能になる可能性があります。

Von Bedeutung

HTTP/3 を利用するように構成されたアプリは、HTTP/1.1 および HTTP/2 もサポートするように設計する必要があります。 HTTP/3 で問題が特定された場合は、.NET の将来のリリースで問題が解決されるまで、HTTP/3 を無効にすることをお勧めします。

HttpClient の設定

HTTP バージョンは、 HttpRequestMessage.Version を 3.0 に設定することで構成できます。 ただし、すべてのルーター、ファイアウォール、プロキシが HTTP/3 を適切にサポートしているわけではないため、HTTP/1.1 および HTTP/2 と共に HTTP/3 を構成することをお勧めします。 HttpClientでは、これを行うには、次のように指定します。

プラットフォームの依存関係

HTTP/3 では、トランスポート プロトコルとして QUIC が使用されます。 HTTP/3 の .NET 実装では 、MsQuic を使用して QUIC 機能が提供されます。 その結果、.NET での HTTP/3 のサポートは、MsQuic プラットフォームの要件に依存します。 MsQuic をインストールする方法の詳細については、「QUIC プラットフォームの依存関係」を参照してください。 HttpClient が実行されているプラットフォームに HTTP/3 のすべての要件がない場合は、無効になります。

HttpClient の使用

次のコード例では 、最上位レベルのステートメント を使用し、要求で HTTP3 を指定する方法を示します。

// See https://aka.ms/new-console-template for more information
using System.Net;

using var client = new HttpClient
{
    DefaultRequestVersion =  HttpVersion.Version30,
    DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact
};

Console.WriteLine("--- localhost:5001 ---");

HttpResponseMessage resp = await client.GetAsync("https://localhost:5001/");
string body = await resp.Content.ReadAsStringAsync();

Console.WriteLine(
    $"status: {resp.StatusCode}, version: {resp.Version}, " +
    $"body: {body.Substring(0, Math.Min(100, body.Length))}");

.NET 6 での HTTP/3 サポート

.NET 6 では、HTTP/3 仕様がまだ完成していないため、HTTP/3 は プレビュー機能 として使用できます。 動作またはパフォーマンスの問題は、.NET 6 の HTTP/3 に存在する可能性があります。 プレビュー機能の詳細については、 プレビュー機能の仕様を参照してください。

.NET 6 で HTTP/3 のサポートを有効にするには、プロジェクト ファイルに RuntimeHostConfigurationOption ノードを含め、 HttpClientで HTTP/3 を有効にします。

<ItemGroup>
    <RuntimeHostConfigurationOption Value="true"
        Include="System.Net.SocketsHttpHandler.Http3Support" />
</ItemGroup>

または、アプリ コードから System.AppContext.SetSwitch を呼び出すか、 DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT 環境変数を trueに設定することもできます。 詳細については、「 .NET 環境変数: DOTNET_SYSTEM_NET_HTTP_*」を参照してください。

HTTP/3 の構成フラグが必要な理由は、バージョン ポリシー RequestVersionOrHigherを使用するときに、アプリが将来破損しないように保護するためです。 現在 HTTP/1.1 と HTTP/2 を使用しているサーバーを呼び出すときに、サーバーが後で HTTP/3 にアップグレードされた場合、クライアントは HTTP/3 を使用しようとし、標準が最終的でないため互換性がないため、.NET 6 のリリース後に変更される可能性があるため、互換性がありません。

.NET 6 は、libmsquic の 1.9.x バージョンとのみ互換性があります。 ライブラリの破壊的変更により、Libmsquic 2.x は .NET 6 と互換性がありません。 セキュリティ修正プログラムを組み込む必要があるとき、Libmsquic では 1.9.x への更新プログラムを受け取ります。

HTTP/3 サーバー

HTTP/3 は、.NET 6 (プレビュー) および .NET 7 (完全にサポート) の Kestrel サーバーを使用した ASP.NET でサポートされています。 詳細については、 ASP.NET Core Kestrel Web サーバーでの HTTP/3 の使用に関するページを参照してください。

パブリック テスト サーバー

Cloudflare は、 https://cloudflare-quic.comでクライアントをテストするために使用できる HTTP/3 用のサイトをホストします。

こちらも参照ください