Reputation: 738
I need to GET contents of a specific URL. It's a simple and straightforward task, though I want is as efficient as possible.
Does WebClient or HttpWebRequest take less memory? Which class will complete the same task faster? Which class takes less time to initialize?
Upvotes: 14
Views: 15439
Reputation: 133995
WebClient
is just a wrapper around HttpWebRequest
. Using WebClient
is potentially slightly (on the order of a few milliseconds) slower than using HttpWebRequest
directly. But that "inefficiency" comes with huge benefits: it requires less code, is easier to use, and you're less likely to make a mistake when using it. Consider, for example, retrieving the text of a Web page using WebClient
:
var client = new WebClient();
var text = client.DownloadString("http://example.com/page.html");
Contrast that to HttpWebRequest
:
string text;
var request = (HttpWebRequest)WebRequest.Create("http://example.com/page.html");
using (var response = request.GetResponse())
{
using (var reader = new StreamReader(response.GetResponseStream()))
{
text = reader.ReadToEnd();
}
}
Things get really interesting if you want to download and save to file. With WebClient
, it's a simple matter of calling DownloadFile
. With HttpWebRequest
, you have to create a reading loop, etc. The number of ways you can make a mistake with HttpWebRequest
is truly astounding. I know 'cause I've made a lot of them.
Now consider downloading two different pages. With WebClient
you can write:
var client = new WebClient();
var page1 = client.DownloadString(page1Url);
var page2 = client.DownloadString(page2Url);
Done. With HttpWebRequest
, you'd have to duplicate the code above, or wrap that code in a method. But if you're going to wrap it in a method, then why not just use WebClient
, which already does it for you?
When you consider that a request to a fast Web site will probably take on the order of 100 to 500 milliseconds, the few milliseconds' overhead that WebClient
adds will amount to at most single-digit percentage of the total time.
Use WebClient
for simple things. Only use HttpWebRequest
if you require the additional low-level control that it offers. Speed considerations among the two are irrelevant.
Upvotes: 33