web-dev-qa-db-ja.com

.NETのWebClientクラスとHTTPWebRequestクラスの違いは何ですか?

.NETのWebClientクラスとHttpWebRequestクラスの違いは何ですか?どちらも非常によく似ています。実際、なぜそれらが1つのクラスにマージされなかったのでしょう(メソッド/変数などが多すぎることが理由の1つですが、.NETにはその規則に違反する他のクラスがあります)。

ありがとう。

173
GurdeepS

WebClientは、最も一般的なタスクを簡素化するために、HttpWebRequestの上に構築された高レベルの抽象化です。たとえば、HttpWebResponseからコンテンツを取得する場合は、応答ストリームから読み取る必要があります。

var http = (HttpWebRequest)WebRequest.Create("http://example.com");
var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

WebClientでは、単にDownloadStringを実行します。

var client = new WebClient();
var content = client.DownloadString("http://example.com");

注:簡潔にするため、両方の例からusingステートメントを省略しました。Web要求オブジェクトを適切に破棄するように注意する必要があります。

一般に、WebClientは迅速でダーティな単純な要求に適しています。HttpWebRequestは、要求全体をより詳細に制御する必要がある場合に適しています。

235
John Sheehan

また、WebClientにはタイムアウトプロパティがありません。 dafault値は100秒であり、インターネット接続がないかどうかを示すには多すぎるため、これが問題です。

その問題の回避策はこちら https://stackoverflow.com/a/3052637/1303422

30
Andriy F.

私は返信するのが長すぎることを知っていますが、将来の読者のための情報目的として:

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

WebRequestは抽象基本クラスです。したがって、実際には直接使用しません。派生クラス-HttpWebRequestおよびFileWebRequestを介して使用します。

WebRequestのインスタンスを作成するには、WebRequestのCreateメソッドを使用します。 GetResponseStreamdata streamを返します。

FileWebRequestからFtpWebRequestであるinheritおよびWebRequestクラスもあります。通常、WebRequestを使用して、リクエストを作成し、リクエストに応じて、戻り値をHttpWebRequestFileWebRequestまたはFtpWebRequestのいずれかに変換します。以下に例を示します。

例:

var _request = (HttpWebRequest)WebRequest.Create("http://stackverflow.com");
var _response = (HttpWebResponse)_request.GetResponse();

WebClient

System.Object
        System.MarshalByRefObject
            System.ComponentModel.Component
                System.Net.WebClient

WebClientは、sendingによって識別されるリソースからのreceivingおよびURIデータに対する一般的な操作を提供します。単純に、それはHttpWebRequestの高レベルの抽象化です。以下のサンプルにも示すように、この「共通操作」はWebClientHttpWebRequestを区別するものです。

例:

var _client = new WebClient();
var _stackContent = _client.DownloadString("http://stackverflow.com");

DownloadDataインスタンスの下には、DownloadFileおよびWebClient操作もあります。これらの一般的な操作は、通常HttpWebRequestで行うことのコードを単純化します。 HttpWebRequestを使用して、リクエストのレスポンスを取得し、StreamReaderをインスタンス化してレスポンスを読み取り、最後に結果を期待するタイプに変換する必要があります。 WebClientを使用すると、単にDownloadData, DownloadFile or DownloadStringを呼び出すだけです。

ただし、WebClient.DownloadStringはリクエストするリソースのencodingを考慮しないことに注意してください。したがって、エンコードとエンコードを指定しないと、おそらく奇妙な文字を受け取ることになります。

注意:基本的に「WebClientは、Webrequest "

25
SHEKHAR SHETE