我正在尝试从一个URL下载文件,我必须在WebClient和HttpClient之间做出选择。我参考了this文章和互联网上的其他几篇文章。到处都有人建议使用HttpClient,因为它具有强大的异步支持和其他.Net 4.5特权。但我仍然不完全相信,需要更多的投入。
我正在使用下面的代码从互联网上下载文件:
Web客户端:
WebClient client = new WebClient();
client.DownloadFile(downloadUrl, filePath);
HTTP客户端:
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage response = await client.GetAsync(url))
using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
{
}
}
从我的Angular 来看,我只能看到使用WebClient的一个缺点,那就是非异步调用阻塞了调用线程。但是如果我不担心线程阻塞,或者使用client.DownloadFileAsync()
来利用异步支持呢?
另一方面,如果我使用HttpClient,我不是将文件的每一个字节都加载到内存中,然后将其写入本地文件吗?如果文件太大,内存开销不是很大吗?如果我们使用WebClient,这可以避免,因为它将直接写入本地文件,而不消耗系统内存。
所以,如果性能是我的绝对优先事项,我应该使用哪种方法下载?我想澄清一下,如果我上面的假设是错误的,我也愿意使用其他方法。
9条答案
按热度按时间8ftvxx2r1#
你可以用.Net 4. 5+原生地做。我试着用你的方式做,然后我刚刚在Intellisense中找到了一个似乎有意义的方法。
https://learn.microsoft.com/en-us/dotnet/api/system.io.stream.copytoasync?view=netframework-4.7.2
sr4lhrrt2#
这是我的方法。
如果您正在调用WebApi来获取文件,则可以从控制器方法使用HttpClient GET请求并使用FileStreamResult返回类型返回文件流。
klr1opcd3#
为了在使用WebClient的现有代码中使用HttpClient,我编写了一个小的扩展方法,以在代码中使用
DownloadFileTaskAsync
的相同方式使用它。要使用它,我们可以有这样的扩展方法:
3gtaxfhh4#
对于重复调用的代码,您不希望将
HttpClient
放在using
块(it will leave hanging ports open)中对于使用HttpClient下载文件,我发现this extension method对我来说似乎是一个很好且可靠的解决方案:
sbdsn5lh5#
Here’s one way to use it to download a URL and save it to a file:(我使用的是Windows 7,因此没有可用的WindowsRT,所以我也使用System.IO。)
注意,代码保存了我在设置中使用的代理服务器的地址,如果指定了这样的设置,就使用它。否则,它应该告诉你所有你需要知道的关于使用HttpClient beta下载和保存文件的信息。
ss2ws0br6#
如果您希望(或必须)同步执行此操作,但使用的是漂亮的HttpClient类,那么有一种简单的方法:
e1xvtsh37#
我的方法很简单。使用
FileStream
你可以将它存储在本地文件夹中,或者使用FileStreamResult
从API返回它。存储到本地文件夹的示例:eblbsuwk8#
这是一个简单的UWP演示程序,用于下载图像文件。只需粘贴图像URL链接并按下载按钮。您可以识别文件类型并更改
fileName
以下载所需的文件。主页.xaml
主页.xaml.xs
您将在此文件夹中找到图像。
Users/[current user name]/AppData/Local/Packages/[Application package name]/LocalState/Images
6xfqseft9#