【问题标题】:C# webclient cannot download text from webC# webclient 无法从 web 下载文本
【发布时间】:2018-12-10 13:10:36
【问题描述】:

我正在做一个从this website 获取文本的项目。 但是当我在 Visual Studio 中测试它时,我遇到了一些错误:

值不能为空。参数名称:solutionDirectory

这是我的代码:

using System;
using System.Net;

public class Program
{
    public static void Main()
    {
        WebClient client = new WebClient();
        String temp = client.DownloadString("http://www.hkex.com.hk/eng/stat/dmstat/dayrpt/hsio180629.htm");
        Console.Write(temp);
    }
}

【问题讨论】:

  • 这不是您提供的代码的问题,除了缺少using 之外,它可以正常工作。
  • 为我工作...

标签: c# webclient


【解决方案1】:

请使用 HttpClient 与 webClient 相比,这是非常好的选项 而且您的问题听起来像是您的项目(vcxproj)文件设置不正确。

因此,只需创建新应用程序并运行此代码。

Here you find Actually Difference

 Stream client = Task.Run(()=>new HttpClient().GetAsync("http://www.hkex.com.hk/eng/stat/dmstat/dayrpt/hsio180629.htm").Result.Content.ReadAsStreamAsync()).Result;
 using (var fileStream = new FileStream("D://data.txt", FileMode.Create, FileAccess.Write))
 {
     client.CopyTo(fileStream);
 }

完整的工作代码:-

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Stream client = Task.Run(()=>new HttpClient().GetAsync("http://www.hkex.com.hk/eng/stat/dmstat/dayrpt/hsio180629.htm").Result.Content.ReadAsStreamAsync()).Result;
            using (var fileStream = new FileStream("D://data.txt", FileMode.Create, FileAccess.Write))
            {
                client.CopyTo(fileStream);
            }
        }
    }
}

等待

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            data();
            Console.ReadKey();
        }
        public static async void data()
        {
            var client = await new HttpClient().GetAsync("http://www.hkex.com.hk/eng/stat/dmstat/dayrpt/hsio180629.htm");
            var data= await client.Content.ReadAsStreamAsync();
            using (var fileStream = new FileStream("D://data.txt", FileMode.Create, FileAccess.Write))
            {
                data.CopyTo(fileStream);
            }
        }
    }
}

【讨论】:

  • IIRC Task.Run 不是必需的,因为 GetAsync 方法已经在可能的情况下异步运行。请使用等待,而不是结果。结果是阻塞的,等待不是。
  • task.run 中的任何方法和代码都不是阻塞@Mafii
  • 但是对.Result的调用是,这就是我所说的。
  • 在任何未完成的任务上调用Result 是一种反模式,最终会搞砸你。不要通过阻塞任务来等待。此外,在您的异步示例中,顶级 Main 方法现在可以声明为异步:static async Task Main(string[] args){},从而消除了即发即弃的需要。
猜你喜欢
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
相关资源
最近更新 更多