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

18行目: 18行目:
==== HttpClientクラス ====
==== HttpClientクラス ====
<code>HttpClient</code>クラスのインスタンスの生成において、<code>IDisposable</code>インターフェースを実装しているので<code>using</code>ブロックで囲うものがある。<br>
<code>HttpClient</code>クラスのインスタンスの生成において、<code>IDisposable</code>インターフェースを実装しているので<code>using</code>ブロックで囲うものがある。<br>
しかし、これは通信を実行するごとにソケットを開くことにより、大量のリソースを消費してリソースが枯渇する場合がある。<br>
<br>
<br>
しかし、これは通信を実行するごとにソケットを開くことにより、大量のリソースを消費してリソースが枯渇する場合がある。<br>
以下の例では、http://aspnetmonsters.com に対して、GETを行う10リクエストを開く。<br>
  <syntaxhighlight lang="c#">
  <syntaxhighlight lang="c#">
  using (var client = new HttpClient())
// アンチパターン
  using System;
using System.Net.Http;
public class Program
  {
  {
     await client.PostAsync("http://iketeru-service.com/");
     public static async Task Main(string[] args)
    {
      for (var i = 0; i < 10; i++)
      {
          using(var client = new HttpClient())
          {
            var result = await client.GetAsync("http://aspnetmonsters.com");
            Console.WriteLine(result.StatusCode);
          }
      }
      Console.WriteLine("Connections done");
    }
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
次に、アプリケーションを終了して、netstatコマンドを実行してPCのソケットの状態を確認する。<br>
<br>
状態は<code>TIME_WAIT</code>であり、WebサイトをホストしているPCへの接続が開かれている状態である。<br>
これは、接続は閉じられているが、ネットワーク上で遅延が発生している可能性があるため、追加のパケットが送られてくるのを待つ状態である。<br>
Proto  Local Address          Foreign Address        State
TCP    10.211.55.6:12050      waws-prod-bay-017:http  TIME_WAIT
TCP    10.211.55.6:12051      waws-prod-bay-017:http  TIME_WAIT
TCP    10.211.55.6:12053      waws-prod-bay-017:http  TIME_WAIT
TCP    10.211.55.6:12054      waws-prod-bay-017:http  TIME_WAIT
TCP    10.211.55.6:12055      waws-prod-bay-017:http  TIME_WAIT
TCP    10.211.55.6:12056      waws-prod-bay-017:http  TIME_WAIT
TCP    10.211.55.6:12057      waws-prod-bay-017:http  TIME_WAIT
TCP    10.211.55.6:12058      waws-prod-bay-017:http  TIME_WAIT
TCP    10.211.55.6:12059      waws-prod-bay-017:http  TIME_WAIT
TCP    10.211.55.6:12060      waws-prod-bay-017:http  TIME_WAIT
TCP    10.211.55.6:12061      waws-prod-bay-017:http  TIME_WAIT
TCP    10.211.55.6:12062      waws-prod-bay-017:http  TIME_WAIT
TCP    127.0.0.1:1695        SIMONTIMMS742B:1696    ESTABLISHED
...略
<br>
==== HttpRequestMessageクラス ====
==== HttpRequestMessageクラス ====
固定のリクエストヘッダや認証情報を付加した<code>HttpRequestMessage</code>クラスを使用する場合、共通の内部メソッドである<code>CreateRequest()</code>を使用する。<br>
固定のリクエストヘッダや認証情報を付加した<code>HttpRequestMessage</code>クラスを使用する場合、共通の内部メソッドである<code>CreateRequest()</code>を使用する。<br>