c# - 使用 WebClient 或 HttpClient 下载文件?

标签 c# .net rest httpclient webclient

我正在尝试从 URL 下载文件,我必须在 WebClient 和 HttpClient 之间做出选择。我引用了 this文章和互联网上的其他几篇文章。在任何地方,都建议使用 HttpClient,因为它具有强大的异步支持和其他 .Net 4.5 特权。但我仍然不完全相信,需要更多的投入。

我正在使用以下代码从互联网下载文件:

网络客户端:

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())
    {
    }
}

从我的角度来看,我只能看到使用 WebClient 的一个缺点,那就是非异步调用,阻塞了调用线程。但是,如果我不担心线程阻塞或使用 client.DownloadFileAsync() 来利用异步支持怎么办?

另一方面,如果我使用 HttpClient,我不是将文件的每个字节都加载到内存中,然后将其写入本地文件吗?如果文件太大,内存开销不会很大吗?如果我们使用 WebClient 就可以避免这种情况,因为它会直接写入本地文件而不占用系统内存。

那么,如果性能是我的首要任务,我应该使用哪种下载方法?如果我的上述假设是错误的,我想得到澄清,我也愿意接受其他方法。

最佳答案

您可以使用 .Net 4.5+ native 执行此操作。我尝试按照您的方式进行操作,然后我在 Intellisense 中找到了一种似乎有意义的方法。

https://learn.microsoft.com/en-us/dotnet/api/system.io.stream.copytoasync?view=netframework-4.7.2

uri = new Uri(generatePdfsRetrieveUrl + pdfGuid + ".pdf");
HttpClient client = new HttpClient();
var response = await client.GetAsync(uri);
using (var fs = new FileStream(
    HostingEnvironment.MapPath(string.Format("~/Downloads/{0}.pdf", pdfGuid)), 
    FileMode.CreateNew))
{
    await response.Content.CopyToAsync(fs);
}

关于c# - 使用 WebClient 或 HttpClient 下载文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45711428/

相关文章:

c# - 如何使用LINQ获取DataGridView单元格值

c# - Docx内容替换

c# - 该名称门在当前上下文中不存在

c# - 按位运算符与 C# 中位操作的 .NET 抽象

c# - 将 .NET 区域设置转换为 jQuery 区域设置 - 当本地资源中不存在国家变体(例如 "-US"或 "-MX")时

spring - 使用Spring/Jetty(或Tomcat)/Maven为REST测试配置集成测试

c# - 使用 HttpClient,在 301 的情况下如何防止自动重定向并获取原始状态代码和转发 Url

c# - 在 C# 中使用 p12 证书从 SFTP 下载文件

java - 我如何使用 Angular 检索其路径存储在数据库中的图像?

java - ReSTLet - 客户端的入门内容 - 路径、接受 header 、查询参数