WebClientとHttpWebRequest / HttpWebResponse


132

クラスHttpWebRequest/Responseで達成できることのほとんどは、WebClientクラスでも達成できるように思えます。私WebClientは、の高レベルのラッパーであるどこかを読みましたWebRequest/Response
これまでのところ、で達成HttpWebRequest/ResponseできないことWebClient、およびHttpWebRequest / Responseがより「きめ細かい」制御を提供する場所は確認できません。

いつWebClientを使用する必要がありますHttpWebRequest/Responseか?(明らかに、HttpWebRequest/ResponseHTTP固有です。)

場合はHttpWebRequest/Response、より低いレベルは、その後ですWebClient、私は何を達成することができますHttpWebRequest/Response私は達成することができないということWebClient

回答:


87

を使用HttpWebRequestすると、リクエストをより詳細に制御できます。Cookie、ヘッダー、プロトコルなどを設定できます...レスポンスでは、Cookieとヘッダーを取得することもできます


14
Thomas、まだ納得できません... WebClientにはHeadersプロパティがあります。次のようにCookieを取得できます:String cookie = webClient.ResponseHeaders(“ Set-Cookie”)そして設定:webClient.Headers.Add( "Cookie"、 " CommunityServer-UserCookie… ");
Dan

14
HttpWebRequestを使用して、タイムアウトを定義できます。WebClientでは、それは不可能です。
ripper234 2010

14
@ ripper234、実際にそれ可能です:HttpWebRequestをカスタマイズするには、WebClientを継承してGetWebRequestをオーバーライドする必要があります
Thomas Levesque

15
@ThomasLevesque Webクライアントを継承してWebリクエストをオーバーライドしている場合、Webクライアントを使用しても意味がないようです...
Hagai L

5
@HagaiL、私は同意しません...リクエスト全体を手動で作成する必要はありません。それを使用base.GetWebRequestして作成し、必要なものをカスタマイズできます
Thomas Levesque

54

HttpWebRequest たとえば、キープアライブを使用するかどうか、使用する接続プール、書き込みをバッファリングするかどうかなど、プロトコルを細かく制御できる多くの要素を公開します。

WebClientこれらのすべてを公開するわけではありません(ただしWebClient、基になるRequestオブジェクトからサブクラス化し、それにアクセスすることはできます)。

WebClientあなただけの操作をしたいような状況のために有用である(例:POST / GET /フォームのアップロード)と、作成および管理に悩まされるカントHttpWebRequestRequestStreamHttpWebResponse、および応答ストリームを。


13
また、私が言及し忘れていたことがもう1つあります。WebClientはComponentオブジェクトですが、HttpWebRequestはそうではありません。どういう意味ですか?Visual Studioを使用してGUIアプリを構築している場合は、WebClientコンポーネントをフォームにドラッグアンドドロップし、それを使用してHTTP / FTPなどのサーバーにリクエストを発行できます。
2009

14

Tim Heuerのブログから-http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

代わりに、Silverlightでは、WebClientまたはHttpWebRequestを使用します。違いは何ですか?これがティムホイヤーバージョンです。WebClientは、GETリクエストを非常に簡単に実行し、応答ストリームを取得する単純な実装です。HttpWebRequestは、リクエストをもう少し細かく制御する必要がある場合、ヘッダーやその他のカスタマイズを送信する必要がある場合に最適です。


7
WebClientはUploadString、UploadData、UploadFileを使用してPOSTも許可します
Thomas Levesque

@ThomasLevesque今日のクラスの新しいバージョンはありますか?私はこの議論が少し、うーん...
古い

@KonradViltersten、私はWebClientクラスに多くの変更があったとは思いません。新しいアプリの場合は、代わりにHttpClientを使用することをお勧めします。これも非常に使いやすく、はるかに柔軟です。
Thomas Levesque

1
@ThomasLevesqueそうですね、それは私が考えていたものです。クラス名の違いとしてhttpを思い出し、Http ...の部分で誤解を招きました。今、私は正しい軌道に戻っています。ありがとう!
Konrad Viltersten、2015

12

Webクライアントのユーザー・インターフェース・スレッド上のクラスを実行すると、データがインターネットからダウンロードされている間、ユーザーインターフェイスが応答しないようにします。一方、HttpWebRequestクラスはユーザーインターフェイススレッドをブロックせず、アプリケーションは応答します。そのため、インターネットから大量のデータをダウンロードするアプリの場合、またはデータのソースへのアクセスが遅い場合は、HttpWebRequestクラスを使用する必要があります。それ以外の場合はすべて、WebClientクラスを使用する必要があります。


1
WP7ではその逆です。HttpWebRequestがMangoのUIスレッドにマーシャリングするため、現時点で悲しみの終わりはありません。Grrr
Cameron MacFarland

6
WebClientは非同期メソッドもサポートしています。
Cyber​​Monk 2013年

6

もう1つの欠点WebClientは、HTTP を使用して応答テキストを取得するときにHTTP ContentTypecharset値を無視することです。Encodingプロパティを介してエンコーディングを明示的に設定する必要があります。


これは良い点です。設定の問題だけでEncodingはありません- 要求が終わるまでエンコーディングを知ることができないため、WebClient APIは、未知のエンコーディングで文字列を適切にダウンロードできる可能性を非常に低くします。
Eamon Nerbonne、2015年


5

「HtttpWebRequest」は.NET 4.5で廃止されました。現在、このクラスは内部専用です。


2
確かに。WebRequest代わりに使用してください。
シルクファイア2015

2
クラスは廃止されていません。コンストラクタは廃止されています。そしてクラスは内部ではなく、まだ公開されています。
user247702

2

1つの例:WebClientでは、1つの要求/応答サイクルでデータを投稿し、処理されたデータを取得することは不可能に思われますが、HtttpWebRequestでそれを行うことができます。


2
WebClient.UploadStringまたはWebClient.UploadDataを使用してPOSTを実行し、応答文字列またはバイト配列を取得するだけです。
samjudson 2011

2
明確にするために、UploadStringの戻り値は文字列で、UploadDataメソッドの戻り値はバイト配列です。
ノーマンH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.