-
Notifications
You must be signed in to change notification settings - Fork 111
HttpClientの取り回しを再検討 #713
Comments
ドキュメントには、
(日本語がおかしいのはご愛敬) とあります。 また、サンプルコードとして以下の物があります。 サンプルコード中では、ループ内で CancellationTokenSource を使い回していますが CancellationTokenSource 自体はリクエスト毎に都度使い捨てで問題ないかと思います。 C# 的にこれがベストな方法かは判断が付きかねますが、実装の一案ではありそうです。 |
こちらについては以下の様な記述があります。
|
個人的には RequestHeader や Timeout の値が異なる少数の HttpClient を保持する分には許容されるのでは無いかと考えますが、こちらは識者の意見が欲しい所です。 |
これについては段階的に直していきます。 まずは現時点で分かっていることとして、現在の実装では 一方、コネクションプールの廃棄はとてもコストの高い処理になりますので、現在のdevelopの実装がイケてない、非効率的なものという点で修正の優先順位は高いです(この実装でリリースはしない)。 根本的にはHttpClientServiceから各Serviceに必要な設定のHttpClientを割り振る予定です。 このIssueはOpenのままにしておくので、なにか知見があればお寄せいただければ。 |
御意。 |
情報共有の為に記述しておきます。 HttpClient の dispose で TCP/IP のソケットは解放されることが期待されます。 またクライアントリソースの問題だけで無く、ファイヤーウォールやNAPTのセッション上限に達する可能性もありますので、問題が発生すると原因にたどり着くのが困難になることも想定されます。 杞憂であるとは考えていますが、そう言うこともあり得ると言う事は覚えておいて戴きたいかなと思いました。 |
やっぱり、Singletonなサービスにタイプ別のHttpClientを3つくらい保持して、それぞれのサービスから使う。ってのが一番良さそうですね。 |
はい。現状では無難な解決法だと思います。 |
補足として、MS的には IHttpClientFactory を利用する事を推奨しているようです。 実際試している人の記事を見るとパフォーマンスも含めて良好な様子。 ただ、これはこれできちんと調べないと罠がありそうなので、今後の課題かなと言う印象です。 |
#938 にも関わるので、これやります。 |
#684 の対応で、都度HttpClientのインスタンスを作成、検討する方式にしたものの、再利用が原則であるとの指摘あり(同Issueコメント)。
https://docs.microsoft.com/ja-jp/dotnet/api/system.net.http.httpclient?view=net-5.0
実際にSocketが枯渇するかどうかは分かりませんが、HttpClient を都度作り直すのは推奨されないように思います。
Originally posted by @b-wind in #684 (comment)
Timeout再設定時のInvalidOperationExceptionは必ず起きるので対応しなければならないものの、ソケット枯渇のような潜在バグについても潰しておく必要がある。
最良の方式はIHttpClientServiceに目的別のHttpClient(ダウンロード用、APIアクセス用など)のインスタンスを保持して各サービスに割り振ること(#707 で提案)
けどこれは変更が大きくなるので、今回は単純に各サービスが1つのHttpClientを保持する。Timeout設定が一回で済むようにインスタンス化(コンストラクタ?)で実行。としたい。
HttpClientをusingで囲わないでください
https://qiita.com/superriver/items/91781bca04a76aec7dc0
これも対応する。
The text was updated successfully, but these errors were encountered: