クラス | 名前空間 | アセンブリ | 説明 |
---|---|---|---|
WebRequest | System.Net | System.dll | 抽象クラス。CreateメソッドでURIに応じてHttpWebRequestやFtpWebRequestを返す |
HttpWebRequest | System.Net | System.dll | WebRequestを継承したクラス |
WebClient | System.Net | System.dll | HttpWebRequestを簡単に使えるようにしたラッパー |
HttpClient | System.Net.Http | System.Net.Http.dll | .NET 4.5から。async/await対応 |
RestClient RestRequest |
RestSharp | RestSharp.dll | サードパーティ製。内部でHttpWebRequestを使っている。JSON, XMLのシリアライズ・デシリアライズ機能を備えている |
HttpClient
はリクエストの度にインスタンス生成・破棄をしてはいけない。メンバーに持って使いまわすことが推奨されている。インスタンス生成・破棄をするとその度にTCPコネクションが張られ、パフォーマンスを低下させる(開発者を苦しめる.NETのHttpClientのバグと紛らわしいドキュメント)。
しかしそれってWebClient
やHttpWebReqeust
では大丈夫なんだろうか?
→WebClient
でこのようなコードを書いてtcpdump -n port 80
で見てみたところ、大丈夫だった。
ちゃんとTCPコネクションが使いまわされていた。
WebClient.cs
using (WebClient client = new WebClient())
{
client.DownloadDataCompleted += (_, args) =>
{
var headers = client.ResponseHeaders;
string s = "";
for (int i = 0; i < headers.Count; ++i)
{
string header = headers.GetKey(i);
foreach (string value in headers.GetValues(i))
{
s += string.Format("{0}: {1}\r\n", header, value);
}
}
txtHeaders.Text = s;
var bytes = args.Result;
var html = Encoding.UTF8.GetString(bytes);
txtResponse.Text = html;
};
client.DownloadDataAsync(new Uri(url));
}