Net Core HttpClient処理 レスポンス圧縮の詳細
プリアンブル
前の記事で
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
}));
関連
-
.NET Coreでオブジェクトプールを使用する
-
NET6新機能 新構造体の最適化
-
ASP.NET CoreでURLを設定する5つの方法
-
.NET開発サーバー アプリケーション管理ツール
-
ASP.NET Core Dependency Injectionフレームワークの活用
-
ASP.NET Core MVC Dependency Injection ビューとコントローラ
-
ネットパフォーマンスチューニング - ArrayPool 詳細
-
ASP.NET Coreで複数のサービス実装クラスをインジェクトする方法
-
非同期タスクキャンセルと監視のネット実装
-
ASP.NETでのRadioButton(ラジオボタン)の使用について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
.netcoreプロジェクトでIStartupFilterを使用するためのチュートリアル
-
NETガベージコレクション GC診断ツール dotnet-gcmon 使用方法
-
ASP.NET Core ディペンデンシーインジェクションの詳細
-
swagger uiをasp.net coreに統合する原理
-
ASP.NET Core MVC フィルタ
-
ASP.NET Core Web API チュートリアル プロジェクト構成図
-
.NET 6における暗黙の名前空間参照
-
名前 'xxx' が現在のコンテキストに存在しない エラー解決方法の1つ
-
CS0234 名前空間 'Microsoft.AspNet' に型または名前空間名 'Mvc' が存在しない (あなたは
-
ASP.NETのオンライン統計とアプリケーションとセッションを使用した訪問履歴