1. ホーム
  2. Web プログラミング
  3. ASP.NET

Net Core HttpClient処理 レスポンス圧縮の詳細

2022-01-14 14:59:46

プリアンブル

  前の記事で ASP.NET Coreにおけるレスポンス圧縮の実装 に従ってレスポンスを圧縮することがサーバーサイドの主な仕事であると述べました。 Content-Encoding ヘッダからどの圧縮方式を使うかを判断し、返す。以前、グループの誰かが「ネットワークの帯域が広くなった今、サーバー側でリクエストを圧縮する必要はあるのか」と質問していました。確かに、現在では分散・負荷分散技術が成熟し、高い同時実行性と大きなデータの処理を必要とする多くのシナリオは、サーバーノードを追加することで実行できるようになりました。しかし、リソースの制約がある場合や、ある時点では新しいサーバーノードを追加する必要がない場合などは、やはりプログラム自体が持つ通常の処理手段で対処する必要があります。私自身は、応答圧縮の使用シナリオはこれだと思います。比較的厳しい帯域幅の圧力があり、CPUリソースは十分すぎるほどある場合、応答圧縮を使用する全体的な効果は、まだ比較的明白です。
    圧縮と解凍があり、解凍は要求側のクライアントで処理されます。例えば、私たちが最もよく使うHttpクライアントであるブラウザは、多くのブラウザがリクエストを送るとき(例えば、ウェブを閲覧するとき)、デフォルトは {コード 追加 {コード を作成し、レスポンス情報に基づいて関連する解凍を処理します。これらは、ブラウザがすでにリクエストを圧縮・解凍するための機構を内蔵していることに由来しています。似たようなものはたくさんあり、例えば有名なプロキシのパケット取得ツールである Request Head もこの機構を内蔵しています。ただ、手動で処理する必要があるだけで、実装は同じです。自分でプログラムを書くときに、この機構を使う必要があることがある、従来の {ネットHttpWebRequest ネット HttpWebRequest クラスライブラリにはそのような機構はありませんでしたが、後のバージョンで {Net HttpWebRequest HttpClient このような操作を行うための独自のメカニズムを持っています。

I. 使用方法

まず、「Select」ボタンをクリックすることで、「Select」ボタンをクリックする方法について説明します。 Content-Encoding でのレスポンス圧縮はどのように処理されるのでしょうか?

Filder
{{コード

この操作はまだ非常にシンプルで、私たちは操作していない HttpClient のプロパティを使用します。 // custom HttpClientHandler instance HttpClientHandler httpClientHandler = new HttpClientHandler ソースコードの探索]では AutomaticDecompression = DecompressionMethods.GZip }; // use the constructor that passes the custom HttpClientHandler instance using (HttpClient client = new HttpClient(httpClientHandler)) { var response = await client.GetAsync($"http://MyDemo/Home/GetPerson?userId={userId}"); } の真骨頂は {コード と {コード {コード が本当に使っているのは {コード 最も重要なサブクラスの1つ HttpClient すべてのリクエスト操作が HttpClientHandler . ということがわかります。 NET Core HttpClient これは列挙型なので、複数の値が含まれています。 HttpClient のソースコードにある

HttpMessageHandler

この列挙は、デフォルトでは、一般的な出力伸長アルゴリズムのすべてである。

HttpClient

属性があります。

HttpMessageHandler

ここでは HttpClientHandler はもはや特定の機能クラスではなく、初期化や保存に使われます。 HttpMessageHandler の一部のプロパティの値を初期化または保存するコンフィギュレーションクラスです。

AutomaticDecompression

ここでは、解析していません DecompressionMethods はレスポンスの圧縮を処理する以外のものなので、特にそれを見るのではなく、単に {コード 属性の参照を行い、最終的にこのコードを見つけました。

DecompressionMethods

ここで明確になったのは、リクエスト・レスポンス圧縮の実処理はすべて [Flags] public enum DecompressionMethods { // Use all compression and decompression algorithms. All = -1, // Do not use decompression None = 0x0, // Use the gzip decompression algorithm GZip = 0x1, // Use deflate decompression algorithm Deflate = 0x2, // Use Brotli decompression algorithm Brotli = 0x4 Brotli = 0x4} には、先ほども言ったように HttpClientFactory から何らかの実装を行うことが実際の仕組みです。 Core HttpClientFactory+Consul これは、異なる機能実装モジュールを特定の HttpClientFactory をモジュール内で使用します。あるモジュールの機能を使う必要があるときは、直接、対応する PrimaryHandler ハンドラクラスでリクエストを送信し、処理します。この設計思想は {ASP.NET Core ASP.NET Core にも表れています。 HttpClientFactory は、リクエストの処理と出力に異なるエンドポイントを使用します。このことから、私たちは

ConfigurePrimaryHttpMessageHandler

{{コード
{{コード
PrimaryHandler

services.AddHttpClient("mydemo", c => { c.BaseAddress = new Uri("http://MyDemo/"); }).ConfigurePrimaryHttpMessageHandler(provider=> new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip }); {コード {{コード その具体的なコードを見てみましょう。

{{コード
{{コード
HttpClientFactory

HttpClient {{コード

{{コード {{コード まとめてください。

{{コード services.AddHttpClient("mydemo", c => { c.BaseAddress = new Uri("http://MyDemo/"); }).ConfigureHttpClient(provider => new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip }));