け日記

SIerから転職したWebアプリエンジニアが最近のITのキャッチアップに四苦八苦するブログ

C# HttpClientでタイムアウトを設定する

C#APIのコールなどに使われるHttpClientクラス(System.Net.Http名前空間)でタイムアウトを設定・制御する方法です。

  • HttpClientのTimeoutプロパティ(TimeSpanクラス)にタイムアウト時間を設定する(デフォルトは100秒)
  • タイムアウト時にTaskCanceledExceptionがスローされるので、それをキャッチしてタイムアウト時の処理を記述する
using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main()
        {
            GetKenikki().Wait();
        }

        private static async Task GetKenikki()
        {
            var client = new HttpClient();

            // タイムアウト時間の設定(3秒)
            client.Timeout = TimeSpan.FromMilliseconds(3000);

            try
            {
                // このブログへGETアクセス
                var response = await client.GetStringAsync("http://ohke.hateblo.jp/");
                Console.WriteLine(response);
            }
            catch (TaskCanceledException e)
            {
                // タイムアウトの場合、TaskCancelExceptionがスローされる
                Console.WriteLine(e.Message);
            }
        }
    }
}

タイムアウト時間を1msなどに設定すると、例外がスローされることを確認できます。

System.Threading.Tasks.TaskCanceledException: A task was canceled.
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at System.Net.Http.HttpClient.<FinishSendAsync>d__58.MoveNext()
・・・