【问题标题】:C# Download file from webserviceC# 从 web 服务下载文件
【发布时间】:2019-01-07 23:35:21
【问题描述】:

我有一个 Web 服务,例如 this example,用于从服务器下载 zip 文件。当我通过网络浏览器打开 URL 时,我可以正确下载 zip 文件。问题是当我尝试通过我的桌面应用程序下载 zip 文件时。我使用以下代码下载:

WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync(new Uri(@"http://localhost:9000/api/file/GetFile?filename=myPackage.zip"), @"myPackage.zip");

经过测试,我下载了 myPackage.zip,但它是空的,0kb。关于此或任何其他服务器代码 + 客户端代码示例的任何帮助?

【问题讨论】:

  • 这里只是一个健全的检查:你在等待你的异步请求完成吗?
  • ProgressChanged 有没有打过电话?在调试器中验证。如果线程(或主机进程)在第一个块传输之前终止,下载将被中止,这将解释零大小文件。
  • @AlexanderToptygin 如果他正在响应事件,他是否需要这样做?
  • 请确保您使用 DownloadFile 而不是 DownloadFileAsync。并告诉我们它是否能解决问题?
  • 我没有使用 await,它说“不能等待 void”。永远不会调用更改的进度,但完整的是。

标签: c# asp.net-web-api webclient webclient-download


【解决方案1】:

您可以尝试改用 HttpClient。通常,它更方便。

        var client = new HttpClient();
        var response = await client.GetAsync(@"http://localhost:9000/api/file/GetFile?filename=myPackage.zip");

        using (var stream = await response.Content.ReadAsStreamAsync())
        {
            var fileInfo = new FileInfo("myPackage.zip");
            using (var fileStream = fileInfo.OpenWrite())
            {
                await stream.CopyToAsync(fileStream);
            }
        }

【讨论】:

  • 正是我需要的。谢谢。 (顺便说一句,“方便”是相对的。我本可以在 Perl 的一行代码中使用 LWP::UserAgent 模块完成所有这些工作,但是我们必须使用我们所拥有的。):-)跨度>
  • 这很好,尽管应该指出客户端应该被重用,而不是创建一个新实例并在每次使用后处理。 This article explains why
猜你喜欢
  • 2015-04-04
  • 2020-07-02
  • 2016-05-29
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
相关资源
最近更新 更多