###前提
ASP.NETのプログラムから、別サーバのAPIをコールするのにHttpClientクラスを使おうと思っています。
APIはユーザの操作でコールするので、短期間に複数回コールする可能性があります。
HttpClientには下記URLのような仕様があり、対策としてstatic化が有効だと分かりました。
開発者を苦しめる.NETのHttpClientのバグと紛らわしいドキュメント
.NETのHttpClientの取り扱いには要注意という話 - Qiita
###質問内容
知識不足で申し訳ないのですが、ASP.NETでHttpClientを使用する場合も、単純にstatic変数で保持すれば良いのでしょうか?
####気になる点
- スレッドセーフとあるので、複数スレッドから使い回しても問題なさそうに思えます
- ASP.NETのstatic変数で持つと、サーバが再起動でもしなければずっと保持し続けることになると思いますが、問題ないのでしょうか
どのような頻度で呼び出すのでしょう? 参考にされている前者の記事にリンクが張ってあった https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ のコード例のように for ループを回して HttpClient の初期化を繰り返すようなメチャなことをしなければ問題なさそうな気がするのですが・・・
forループでAPIコールを含む処理を回す場合もあるので、リンク先のコード例に近い状態になるかもしれません。処理自体は右から左へAPIで受け渡すだけの単純なもので、ループカウンタも100以上ある想定です。本来ならAPIを使わない形を取るべきだと思いますが、別システムなのでAPIコール以外が取りづらいです。
forループでAPIコールを含む処理を回す場合もあるので ← ループで HttpClient を初期化して、使って、Dispose するのを繰り返すのではなく、一つの要求を処理する際一度だけ初期化してそれを使いまわすようなことではダメなんですか? 試したわけではないので、それでは socket の浪費防止には意味がないのかもしれませんが・・・
ASP.NET はユーザーからの要求ごとにスレッドプールからスレッドを取得して処置するマルチスレッドアプリですので、単一の HttpClient のインスタンスを異なるユーザーが共有してどういうことになるか・・・質問者さん独自の条件とかいろいろあるでしょうから自分は分かりません。好ましからざる副作用がありそうで、できればそういうことをしないで済む方向を検討した方がよさそうな気がします。(気がするだけで、確証はないですが)
すみません、誤解を与える表現でした。確かに要求のなかにforループがありますが、static化しない場合は要求ごとにインスタンスを生成します。ただ、やはり要求の頻度が多ければ同状況になると思いますので、static化したいと考えました。副作用も分からないので、いったんstatic化しない方向で実装し、様子を見てみます。
> いったんstatic化しない方向で実装し、様子を見てみます。 ← それが良いと思います。ここでの今までの話と追加情報を回答欄にまとめて書いておきます。
回答3件
あなたの回答
tips
プレビュー