備忘録

備忘録

HttpClient で任意のHTTPヘッダを指定した時 FormatException が発生する

Ⅰ. はじめに

通常HttpClientでHTTPヘッダを指定する場合は以下のように書くことが出来ます。

var client = new HttpClient();
client.DefaultRequestHeaders.Add("User-Agent", "hoge");

しかし、User-AgnetやAuthorization等のよく知られたヘッダは自動的にパース、検証が行われ*1、誤った値を指定するとSystem.FormatExceptionが発生します。

static void Main(string[] args)
{
  var client = new HttpClient();
  client.DefaultRequestHeaders.Add("User-Agent", "foo=bar");

  var statusCode = client.GetAsync("http://example.com").Result.StatusCode;
  Console.WriteLine(statusCode);
}

実行結果

Unhandled Exception:
  System.FormatException:
    The format of value 'foo=bar' is invalid.

Ⅱ. 検証を回避する方法

Add の代わりに TryAddWithoutValidation*2 を使います。

static void Main(string[] args)
{
  var client = new HttpClient();
  client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "foo=bar");

  var statusCode = client.GetAsync("http://example.com").Result.StatusCode;
  Console.WriteLine(statusCode);
}

実行結果

OK