「C Sharpとネットワーク - HttpClient」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == HttpClientは、アプリケーションにおいてHTTPリクエストを投げたい時に使用するクラスである。<br> .NET Framework 4.5から提…」)
 
編集の要約なし
19行目: 19行目:
  class SmapleClass
  class SmapleClass
  {
  {
     private static HttpClient client = new HttpClient();
     private static readonly HttpClient httpclient = new HttpClient();
   
    static SampleClass()
    {
        httpClient = new HttpClient();
    }
 
     public async Task<SomeResponse> CallAPI()
     public async Task<SomeResponse> CallAPI()
     {
     {

2019年7月8日 (月) 17:06時点における版

概要

HttpClientは、アプリケーションにおいてHTTPリクエストを投げたい時に使用するクラスである。
.NET Framework 4.5から提供された機能で、それまではHttpWebRequestやWebClientが存在したが、
簡単にHTTPリクエストを投げられるクラスとして追加された。

HttpClientの仕様

HttpClientをインスタンス生成した時、内部では新しいソケットをオープンしている。
つまり、メソッドでHttpClientのインスタンスを生成すると、常に新しいソケットをオープンして、リソースを消費することになる。
HttpClientのインスタンスを破棄した場合、ソケットがクローズされるタイミングは、状態がTIME_WAITに遷移して、暫く時間が経ってから解放される。
これはリクエストする回数が少ないのであれば問題は無いが、大量にリクエストを行う場合は大きなボトルネックとなる。

解決策

Microsoftの公式ドキュメント不適切なインスタンス化のアンチパターンの中でこの問題について取り上げており、
HttpClientを使用した実装をする時は、インスタンスを静的変数(static)にして使用するとの記載がある。
下記のサンプルコードに実装方法を示す。

サンプルコード

 class SmapleClass
 {
    private static readonly HttpClient httpclient = new HttpClient();
    
    static SampleClass()
    {
        httpClient = new HttpClient();
    }

    public async Task<SomeResponse> CallAPI()
    {
       await client.PostAsync("{URL}");
       ...
    }
 }


上記のように記述して、HttpClientのオブジェクトを使用する。(TimeOutの設定等はコンストラクタで行う)
同時実行の場合も、HttpClientはそのような利用を想定した設計となっている。

また、他の注意点を挙げると、1つのHttpClientオブジェクトで1つのソケット(1つのホスト)なので、
異なるホストにもリクエストを投げる場合は、別のオブジェクトを生成する方が良い。