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

眺める: 9666|答える: 7

[出典] ASP.NET Core(XV)はHttpClientを使ってHTTPリクエストを送信します

[リンクをコピー]
掲載地 2022/05/14 19:37:21 | | | |
ASP.NET でアプリケーションを構築する際、HttpClientクラスのインスタンスを使ってHTTPリクエストを行います。 HttpClientの使用は簡単そうに思えるかもしれません。 しかし、いくつかの潜在的な問題は、アプリケーションが重負荷にさらされるまで気づかれません。

.NETで提供された元のHttpClientクラスに関する問題:ハイパーリンクのログインが見えます。

HttpClientはIDisposableを実装する際に、それをuse文で宣言・インスタンス化することは推奨されません。なぜなら、なぜならHttpClientオブジェクトをリリースする際、基盤となるソケットはリリースされません直ぐに解放これがソケットの消耗問題を引き起こすことがあります。

問題はHttpClient自体ではなく、HttpClientのデフォルトの構成体にあります。なぜなら、上記の「ソケット枯渇」やDNS変更の問題を伴う新しい実際のHttpMessageHandlerインスタンスが生成されるからです。



HttpClientを直接作成する(誤った使い方)

HttpClientオブジェクトを直接インスタンス化し、Disposeメソッドへの呼び出しを保証するために使用を追加します。コードは以下の通りです:

インターフェースを5回呼び出し、HttpClientを使ってHTTPリクエストを送信し、以下のコマンドでネットワーク接続を確認します。

HttpClientがリリースされると、ローカルコンピュータとターゲットサーバー間の接続はTIME_WAIT並行性が高い場合、誤差は次のように報告されます。

リモートサーバーに接続できません
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.


ご質問がある場合は、以下も参照してください:

HttpClinetを誤って使うとソフトウェアが壊れる可能性があります
https://www.itsvse.com/thread-10310-1-1.html
IHttpClientFactoryでHttpClinetを作成してください(正しい使い方)

DI依存注入を用いるIHttpClientFactoryは、IHttpClientFactoryで作成されるHttpLinetと同じです。

サービスを追加してスタートアップファイルにすると、コードは以下の通りです:

HomeControllerのコントローラーコードは以下の通りです:

また、HttpClinetを使ってコールインターフェースを通じて5件のリクエストを送信し、マシンはターゲットサーバーとの接続のみを確立し、リクエストプロセス中にその接続を再利用します。 以下に示すように:



IHttpClientFactoryは、工場で作成されたHttpMessageHandlerインスタンスをプールにまとめてリソース消費を削減します。 新しいHttpClientインスタンスを作成する際、HttpMessageHandlerインスタンスが有効期限でなければプール内で再利用できます。

{
    「ライフタイム」:「シングルトン」
    「ServiceType」: 「System.Net.Http.IHttpClientFactory」,
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  },
  {
    「ライフタイム」:「シングルトン」
    「ServiceType」: 「System.Net.Http.IHttpMessageHandlerFactory」
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  }
IHttpClientFactoryはデフォルトでDefaultHttpClientFactoryとして実装されており、ソースコードアドレスは以下の通りです:ハイパーリンクのログインが見えます。

DI対応アプリケーションでIHttpClientFactoryを使用することで、以下のことを回避できます:

  • HttpMessageHandlerインスタンスを共有することでリソース枯渇の問題を解決します。
  • DNSのステイルを解消するには、定期的にHttpMessageHandlerインスタンスをループさせて対応します。


さらに、上記の問題を解決する他の方法もあり、長寿命のSocketsHttpHandlerインスタンスを用います。

  • アプリの起動時にSocketsHttpHandlerのインスタンスを作成し、アプリのライフサイクル全体を通して使用してください。
  • DNSの更新時間に基づいて適切な値にPooledConnectionLifetimeを設定してください。
  • 必要に応じて新しいHttpClient(handler, disposeHandler: false)を使ってHttpClientのインスタンスを作成します。


上記のアプローチは、IHttpClientFactoryと同様の方法でリソース管理の問題を解決します。

  • HttpClientインスタンス間のSocketsHttpHandler共有接続。 この共有により、ソケットの消耗を防ぎます。
  • SocketsHttpHandlerは、DNSのステール化を防ぐためにPooledConnectionLifetimeに基づいて接続をループします。


詳細や設定については、以下をご覧ください:

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





先の:HttpClientを誤って使うとソフトウェアが壊れる可能性があります
次に:jQuery Datatables 国際化プラグイン
 地主| 掲載地 2022/05/14 19:38:14 |
復習

ASP.NET Core(14)はSkiaSharpの画像キャプチャに基づいています
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core(XIII)で、それがAjaxリクエストかどうかを判定します
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET コア(12)フロントエンドJS、CSSバンドル、圧縮
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET Core(XI)エンドポイントルートは、すべてのDIサービスを表示するためのミドルウェアを追加します
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Core(10)における構成優先度の詳細な説明。
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Core (9)のミドルウェアミドルウェアの詳細な説明。
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET コアミドルウェアの詳細な説明
https://www.itsvse.com/thread-8126-1-1.html

Core(8)のSwagger UIのデフォルトパラメータの穴 ASP.NET。
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET コア(7) フレームワークソースコードの詳細な分析
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET Core (VI) DIはオブジェクト注入の方法を手動で取得します
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET コア(5)はCAP分散トランザクションに基づいています
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Core(4) フィルター 統一モデルステートモデル検証
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET コア(iii) ActivatorUtilitiesを用いて動的にインスタンスを作成する
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET コア(2) コードによるアプリケーションの再起動
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core(1)はRedisキャッシュを使用しています
https://www.itsvse.com/thread-9393-1-1.html
 地主| 掲載地 2022/05/14 19:41:13 |
HttpClientHandler ソースコード:https://github.com/dotnet/runtim ... andler.AnyMobile.cs
SocketsHttpHandler ソースコード:https://github.com/dotnet/runtim ... obalHttpSettings.cs
掲載地 2022/05/14 22:36:06 |
覚えてみろ
掲載地 2022/05/19 9:45:12 |
さあ、続編をチェックしてください
掲載地 2022/08/18 16:13:45 |
素晴らしい学びと学びです
 地主| 掲載地 2023/06/24 13:07:32 |
.NET/C# Httpクライアントソースコードの簡単な解析
https://www.itsvse.com/thread-10617-1-1.html
 地主| 掲載地 2024/09/05 14:35:55 |
HttpClientFactoryServiceCollectionExtensionsのソースコードをチェックしてみてください

IHttpClientFactoryのデフォルト実装は以下の通りです。DefaultHttpClientFactory、下図に示されているように:



DefaultHttpClientFactoryのCreateClientメソッドはHttpClientオブジェクトをインスタンス化しますdisposeHandler: false、下図に示されているように:



免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com