【问题标题】:WebClient.DownloadFile requires what exactly for the URI?WebClient.DownloadFile 究竟需要什么 URI?
【发布时间】:2019-01-24 03:57:00
【问题描述】:

我对代码很满意,它适用于我的其他解决方案。我有一个知识空白,因为我不明白什么是 URI。这应该有效,但无效:

https://www.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=nasdaq&render=download

现在我在想这不是一个文件,对吧?将上述内容扔向浏览器会提供一个文件。异常消息是“底层连接已关闭:接收时发生意外错误。”

        String address = "https://www.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=nasdaq&render=download";

.....

        using (WebClient Client = new WebClient())
        {
            try
            {
                Client.DownloadFile(address, destPath + filename);
            }
            catch (Exception ex)
            {
                Log.Line("Error: " + ex.Message);
                return 1;
            }
        }

URI: this link

【问题讨论】:

  • 你的代码是什么? WebClient.DownloadFile(...,在问题中提供。
  • 我无法访问您的链接,但是是的,这是一个 URL,可以很好地传递给 DownloadFile如何服务器响应可能涉及大量因素,这意味着在某些情况下(通过浏览器,如果您已经在该站点上建立了会话,例如)它会给您一个文件在其他情况下,您会收到错误消息。这就是网络的本质。现在,可能是那个 URL 做了奇怪的重定向,浏览器会处理而 DownloadFile 不会。同样,我无法访问它来评估它。
  • 嗯,点击上面我自己的链接不起作用。如果我复制到记事本并粘贴到浏览器中,她就可以工作。试试看。我已经编辑在问题中还包含一个 HTML 链接。
  • WebClient 需要:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 和一个不支持最近安全升级的用户代理。使用 Internet Explorer/Edge 标头:Mozilla/5.0 (Windows NT 10; WOW64; Trident / 7.0; rv: 11.0) like Gecko。然后下载完成。
  • 安全协议是HSTS:HTTP Strict Transport Security。 WebRequest/WebResponse 不支持此功能,因此当服务器认为它可以使用它时,连接会 AWOL。

标签: c# webclient-download


【解决方案1】:

你有一个完全有效的 URI。目标服务器可能以与您预期不同的方式响应请求。例如,取决于您的 Web 客户端。要调试此类问题,请使用curl

curl -v https://www.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=nasdaq&render=download

上面的命令显示服务器没有回复预期的 csv 文件。这在您的代码中不是问题。您可以尝试使用 curl -H 标志假装不同的用户代理或设置一些重定向选项,直到您到达那里。

在您的具体情况下,似乎是标题 Accept-Encoding: gzip 解决了问题。

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多