この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 537|答える: 1

[出典] .NET/C#のHttpClientはHttp/2.0バージョンプロトコルを使用しています

[リンクをコピー]
2025年8月31日 21:16:47 に投稿 | | | |
要件:現在、ほとんどのウェブサイトは主にHttp/1.1およびHttp/2.0バージョンプロトコルを使用していますが、HTTP/2プロトコルのみをサポートするウェブサイトでは、HttpClientを使ってリクエストを送信すると、デフォルトでSystem.Net.Http.Http.HttpRequestExceptionが発生します:リクエスト送信中にエラーが発生しました。 ---> System.IO.IOException:トランスポート接続からデータを読み取れない:ホストのソフトウェアが確立された接続を中止しました。 ---> System.Net.Sockets.SocketException(10053):ホストのソフトウェアが確立された接続を中止します。 at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.CreateException(SocketError error, Boolean forAsyncThrow).

HTTPプロトコルの歴史

タイムライン



HTTP/0.9

廃止されたHTTP/0.9は1989年に誕生したHTTPプロトコルの最初のバージョンでした。 非常にシンプルで、クライアントがGETリクエストを送信でき、リクエストヘッダーをサポートしません。 プロトコルヘッダーがないため、HTTP/0.9は一種類のコンテンツ、すなわちプレーンテキストしかサポートできません。 サーバーはHTML形式の文字列にのみ応答でき、他の形式には応答できません。 サーバーの送信が完了すると、TCP接続は閉じられます。
HTTP/0.9は典型的な状態なしであり、各訪問は独立して処理され、処理完了すると切断されます。 要求されたページが存在しない場合は、エラーコードは返されません。

HTTP/1

HTTP/1はHTTP 1.0とHTTP 1.1の総称であり、それぞれ1.0と1.1のHTTPプロトコルのバージョンを指します。
HTTP 1.0はHTTPプロトコルの第2版であり、現在でも広く採用されています。 HTTP/0.9を基に、以下のような多くの改良や強化が施されています。

画像、動画、バイナリなど、テキストだけでなく送信可能なフォーマットも増えました
さらに、POSTリクエストメソッドも追加されました
HTTPリクエストとレスポンスの形式を変更しました。 データ部分に加えて、各通信にはHTTPヘッダーが含まれ、特定のメタデータを記述しなければなりません。すなわち、リクエストヘッダー情報が追加されます
レスポンスステータスコード、マルチ文字セットのサポート、認可、キャッシュ、コンテンツエンコーディングなどの追加機能
依然としてステートレスプロトコルですが、リクエストに「Connection: keep-alive」ヘッダーを追加することで長距離接続をサポートできます

HTTP 1.1

HTTP 1.1は標準化されたプロトコルであり、多くの曖昧さを排除し、いくつかの改良を加えています。

特異

キャッシュ処理において、HTTP 1.1ではエンティティタグ、If-Unmodified-Sence、If-Match、If-None-Matchなどのキャッシュ制御ポリシーが増え、キャッシュポリシーを制御するためのオプションキャッシュヘッダーも増えました。
帯域幅の最適化とネットワーク接続の利用により、リクエストヘッダーに範囲が導入され、リソースの一部(206ステータスコードを返す)だけを要求できるようになり、開発者は帯域幅とリンクの最大限の活用を自由に選択できるようになり、RangeとContent-Rangeを使ってブレークポイント再開関数を作成できます。
エラー通知管理、HTTP 1.1で24の新しいエラーステータスコードが追加されました。
Hostヘッダーを追加することで、同じIPアドレスのサーバー上で異なるドメイン名を設定できます。
長距離接続に対応しており、HTTP 1.1は長距離接続に対応し、TCP接続上で複数のHTTPリクエストとレスポンスを送信できるため、接続の確立やクローズの消費と遅延を削減できます。また、HTTP 1.1ではConnection:keep-aliveがデフォルトで有効化されており、一般的なブラウザでは同じドメイン名に対して6つの長いリンクを同時に設定できます。
キューブロッキングを改善するために、最初の応答が完全に送信される前に2回目のリクエストを送信できるパイプライン技術が追加されましたが、応答の順序は依然としてリクエストの順序で返されます。
応答チャンク化をサポートするには、チャンク応答のためにTransfer-Encoding: chunkedを設定し、応答データを複数の部分に分割し、サーバーができるだけ早くバッファを解放してより高速な応答速度を得ることができます。

HTTP 2.0

HTTP 2.0は性能が向上し、ウェブページはますます複雑になり、独自のアプリケーションへと進化しています。メディア再生量やインタラクションを強化するスクリプトのサイズも大幅に増加し、HTTPリクエストで送信されるデータも増えました。これにより、HTTP 2.0はネットワーク効率のために多くの最適化を行っています。

特異

バイナリフレーム分割(HTTP 2.0)はテキストプロトコルではなくバイナリプロトコルであり、送信されたすべての情報をより小さなメッセージやフレームに分割し、バイナリ形式でエンコードします。
多重化や並列リクエストも同じリンク上で処理でき、同じドメイン名内のすべてのアクセスは同じTCP接続から行われ、HTTPメッセージは独立したフレームに分割され、サーバーは識別子やヘッダーに従ってメッセージを再構成します。これによりHTTP 1.1の順序やブロッキング制約が解消されます。
一連のリクエストで似たヘッダーを圧縮することで、重複データの重複や送信コストを削減できます。
サーバーサイドプッシュでは、サーバーがクライアントからの明示的なリクエストなしに積極的にリソースをクライアントにプッシュできます。

HTTP 3.0

HTTP 3.0は現在、開発・テスト段階にあり、将来的に新しいHTTPプロトコルとして登場します。HTTP 3.0プロトコルはQUICプロトコルの上に動作し、UDPに基づいて信頼性の高い伝送を実現し、伝送速度と信頼性をトレードオフし最適化します。UDPを使用することでTCPキューブロッキング問題を回避し、ネットワーク伝送速度を向上させますが、信頼性の高い伝送メカニズムも実現する必要があります。HTTP 3.0はHTTP 2.0の拡張ではありません。 3.0は全く新しいプロトコルとなります。

HttpClientHandler VS SocketsHttpHandler

.NET Frameworkおよび.NET Core 2.0以前でHttpClientが使用しているデフォルトのメッセージハンドラはHttpClientHandlerです。

.NET Core 2.1から、クラスSocketsHttpHandlerはより高度なHTTPネットワーククラスを提供します(例:HttpClient)。 SocketsHttpHandlerを使用することには多くの利点があります:

パフォーマンスは過去の実装と比べて大幅に向上しています。
プラットフォーム依存を排除し、展開とサービスを簡素化しましょう。 例えば、libcurlはmacOSの.NET CoreやLinuxの.NET Coreに依存していません。
すべての.NETプラットフォームで一貫した挙動を。

.NET 9では、HttpClientFactoryはSocketsHttpHandlerをメインハンドラとして使用しています

HttpClientFactoryは、名前付きおよび型付けされたHttpMessageHandlerオブジェクトのHttpClientパイプラインの設定を可能にします。 ネットワーク上で実際にリクエストを送信する最も内側のハンドラはマスターハンドラーと呼ばれます。 設定されていなければ、このハンドラは常に以前からHttpClientHandlerでした。 デフォルトのマスターハンドラーは実装の詳細ですが、それに依存するユーザーもいます。 例えば、一部のユーザーはメインハンドラーをClientCertificates、UseCookies、UseProxyなどのHttpClientHandler設定プロパティにキャストします。

リンク:ハイパーリンクのログインが見えます。

グローバル構成はHTTPプロトコルのバージョンを要求します

コードは以下の通りです:

DefaultRequestVersionデフォルト設定はHttpVersion.Version11です。

DefaultRequestVersionプロパティは、このHttpClientインスタンスを通じて送信されるリクエストに対して、送信するHttpRequestMessageを構成する際に使用するデフォルトのHTTPバージョンを指定します。具体的には、、、、GetStreamAsyncGetAsyncGetAsyncGetByteArrayAsync, PatchAsyncGetStringAsync, PostAsyncとPutAsyncです。

DefaultRequestVersion プロパティSendAsyncメソッドには適用されません。 SendAsyncメソッドにパラメータとして渡されるHttpRequestMessageパラメータは、リクエストに使用されるHTTPバージョンを制御する独自のVersionプロパティを持ちます。

リンク:ハイパーリンクのログインが見えます。

HttpVersionPolicy 交渉ポリシー

RequestVersionOrLower: リクエストされたバージョンを使うか、より低いバージョンにダウングレードしてください(ただしリクエストされたバージョンより高くはありません)。 これがデフォルトの動作です。 簡単に言えば、最も多く使用されているプロトコルバージョンは現在のバージョンであり、現在のプロトコルバージョンがサポートされていなければダウングレードされます。
RequestVersionOrHigher: サーバーがサポートする最高バージョンを使用し、要求されたバージョンより低くはない。 つまり、アップグレードは許可されており、要求されたバージョン以下のダウングレードは許可されません。 簡単に言えば、可能な限り通信には高バージョンのプロトコルを使いましょう。
RequestVersionExact: リクエストされたバージョンのみを使用してください。アップグレードやダウングレードは一切許可されていません。

HttpClientはHttp/2.0バージョンプロトコルを使用しています

テストコードは以下の通りです:

リクエストはバージョン1.1を使用し、最終クライアントとサーバーは2.0プロトコルを使って通信を行うため、最終応答はバージョン2.0となります。以下の図に示されています。



参考:

ハイパーリンクのログインが見えます。
ハイパーリンクのログインが見えます。
ハイパーリンクのログインが見えます。




先の:MinIOストレージ(iii)ローカルファイルをminioバケットにコピーアップロード(移行)する
次に:.NET/C#はPDFをImageMagickやGhostScriptに基づく画像に変換します
 地主| 2025年8月31日 21:46:27に投稿 |
リクエスト中止:SSL/TLSのセキュアチャネルソリューションの作成に失敗
https://www.itsvse.com/thread-7612-1-1.html
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com