「C Sharpとネットワーク - HttpClient」の版間の差分
ナビゲーションに移動
検索に移動
細 (Wiki がページ「HttpClientの取り扱い」を「C Sharpとネットワーク - HttpClient」に、リダイレクトを残さずに移動しました) |
細 (文字列「<source lang」を「<syntaxhighlight lang」に置換) |
||
16行目: | 16行目: | ||
== サンプルコード == | == サンプルコード == | ||
< | <syntaxhighlight lang="cpp"> | ||
class SmapleClass | class SmapleClass | ||
{ | { |
2021年11月22日 (月) 11:36時点における版
概要
HttpClientは、アプリケーションにおいてHTTPリクエストを投げたい時に使用するクラスである。
.NET Framework 4.5から提供された機能で、それまではHttpWebRequestやWebClientが存在したが、
簡単にHTTPリクエストを投げられるクラスとして追加された。
HttpClientの仕様
HttpClientをインスタンス生成した時、内部では新しいソケットをオープンしている。
つまり、メソッドでHttpClientのインスタンスを生成すると、常に新しいソケットをオープンして、リソースを消費することになる。
HttpClientのインスタンスを破棄した場合、ソケットがクローズされるタイミングは、状態がTIME_WAITに遷移して、暫く時間が経ってから解放される。
これはリクエストする回数が少ないのであれば問題は無いが、大量にリクエストを行う場合は大きなボトルネックとなる。
解決策
Microsoftの公式ドキュメント不適切なインスタンス化のアンチパターンの中でこの問題について取り上げており、
HttpClientを使用した実装をする時は、インスタンスを静的変数(static)にして使用するとの記載がある。
下記のサンプルコードに実装方法を示す。
サンプルコード
<syntaxhighlight lang="cpp"> class SmapleClass { private static readonly HttpClient httpclient = null; static SampleClass() { httpclient = new HttpClient(); }
public async Task<SomeResponse> CallAPI() { await httpclient.PostAsync("{URL}"); ... } } </source>
上記のように記述して、HttpClientのオブジェクトを使用する。(TimeOutの設定等はコンストラクタで行う)
同時実行の場合も、HttpClientはそのような利用を想定した設計となっている。
また、他の注意点を挙げると、1つのHttpClientオブジェクトで1つのソケット(1つのホスト)なので、
異なるホストにもリクエストを投げる場合は、別のオブジェクトを生成する方が良い。