WebClientとHttpClientとHttpWebRequestをいつ使用するか

.NETFrameworkで作業するときにRESTAPIを使用するには、WebClient、HttpClient、およびHttpWebRequestの3つの異なる選択肢があります。この投稿では、管理された環境内から、つまりサードパーティのライブラリに頼らずにRESTAPIにアクセスできるこれらの3つの方法について説明します。次のセクションでは、これらのアプローチを関連するコード例とともに説明し、概念をよりよく理解できるようにします。

一言で言えば、WebRequest(HTTP固有の実装であるHttpWebRequest)は、.NETFrameworkでHTTP要求を消費する元の方法を表しています。WebClientは、HttpWebRequestのシンプルですが制限されたラッパーを提供します。また、HttpClientは、HTTPリクエストと投稿を行うための新しく改善された方法であり、.NET Framework4.5に付属しています。

WebRequest抽象クラスから議論を始めましょう。

System.Net.WebRequest

System.Net.WebRequestクラスは抽象クラスです。したがって、このクラスを使用してHTTPリクエストを使用するには、HttpWebRequestまたはFileWebRequestを作成する必要があります。次のコードスニペットは、WebRequestを操作する方法を示しています。

WebRequest webRequest = WebRequest.Create(uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

HttpWebResponse webResponse =(HttpWebResponse)webRequest.GetResponse();

System.Net.HttpWebRequest

WebRequestは、HTTP要求を消費するために.NETFrameworkで提供された最初のクラスでした。これにより、ユーザーインターフェイススレッドをブロックすることなく、要求オブジェクトと応答オブジェクトのあらゆる側面を柔軟に処理できます。このクラスを使用して、HTTPを操作するときに、ヘッダー、Cookie、プロトコル、およびタイムアウトにアクセスして操作できます。次のコードスニペットは、HttpWebRequestの使用方法を示しています。

HttpWebRequest http = HttpWebRequest)WebRequest.Create(“ // localhost:8900 / api / default”);

WebResponse応答= http.GetResponse();

MemoryStream memoryStream = response.GetResponseStream();

StreamReader streamReader = new StreamReader(memoryStream);

文字列データ= streamReader.ReadToEnd();

HttpWebRequestに関するMicrosoftのドキュメントはここにあります。 

System.Net.WebClient

.NETのSystem.Net.WebClientクラスは、HttpWebRequestの上に高レベルの抽象化を提供します。WebClientはHttpWebRequestの単なるラッパーであるため、内部でHttpWebRequestを使用します。したがって、WebClientはHttpWebRequestに比べて少し遅いですが、必要なコードははるかに少なくなります。WebClientを使用して、HTTPサービスに接続して操作する簡単な方法を使用できます。HttpWebRequestが提供する追加機能を活用する必要がない限り、通常はHttpWebRequestよりも適切な選択です。次のコードスニペットは、WebClientを操作する方法を示しています。

文字列データ= null;

using(var webClient = new WebClient())

{{

    データ= webClient.DownloadString(url);

}

System.Net.Http.HttpClient

HttpClientは.NETFramework4.5で導入されました。.NET 4.5以降を使用している開発者にとっては、使用しない特別な理由がない限り、HTTP要求を使用するための推奨される方法です。本質的に、HttpClientは、HttpWebRequestの柔軟性とWebClientの単純さを組み合わせて、両方の長所を提供します。

HttpWebRequestクラスは、要求/応答オブジェクトに対する多くの制御を提供します。ただし、HttpClientがWebClientの代わりになるように設計されたことはないことに注意してください。HttpWebRequestが提供する追加機能が必要な場合は、HttpClientの代わりにHttpWebRequestを使用する必要があります。さらに、WebClientとは異なり、HttpClientには進行状況レポートとカスタムURIスキームのサポートがありません。 

HttpClientはFTPをサポートしていませんが、HttpClientのモックとテストは簡単です。HttpClientのすべてのI / Oバウンドメソッドは非同期であり、同じHttpClientインスタンスを使用して同時リクエストを行うこともできます。次のコードスニペットは、HttpClientを操作する方法を示しています。

public async Task GetAuthorsAsync(string uri)

{{

    著者author = null;

    HttpResponseMessage response = await client.GetAsync(uri);

    if(response.IsSuccessStatusCode)

    {{

        著者=応答を待つ.Content.ReadAsAsync();

    }

    作者を返す;

}

応答にエラーがある場合、HttpClientはエラーをスローしないことに注意してください。むしろ、IsSuccessStatusCodeプロパティをfalseに設定します。IsSuccessStatusCodeプロパティがfalseの場合に例外をスローする場合は、EnsureSuccessStatusCode以下に示すように、応答インスタンスのメソッドを呼び出すことができます。

response.EnsureSuccessStatusCode();

HttpClientは、一度インスタンス化され、アプリケーションのライフサイクル全体で再利用されるように設計されています。アプリケーションが処理する必要のあるすべての要求に対して、新しいHttpClientインスタンスを作成しないでください。これを行うと、使用可能なソケットが大量のトラフィックによって使い果たされ、SocketExceptionエラーが発生する可能性があります 。推奨される方法は、単一の共有HttpClientインスタンスを作成することです。