为啥当 URL 使用 Web 浏览器工作时,WebClient.DownloadFile 方法不起作用并显示“未找到 JSON”?

Posted

技术标签:

【中文标题】为啥当 URL 使用 Web 浏览器工作时,WebClient.DownloadFile 方法不起作用并显示“未找到 JSON”?【英文标题】:Why does the WebClient.DownloadFile method not work and say "JSON not found" while the URL is working using a Web browser?为什么当 URL 使用 Web 浏览器工作时,WebClient.DownloadFile 方法不起作用并显示“未找到 JSON”? 【发布时间】:2021-10-15 16:13:59 【问题描述】:

我正在尝试使用以下代码使用 C# 下载文件:

using (var client = new WebClient())

    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
    string downloadUrl = "https://data.3dbag.nl/cityjson/v21031_7425c21b/3dbag_v21031_7425c21b_8044.json";
    string destinationFile = "test.json";
    client.DownloadFile(downloadUrl, destinationFile);

一个示例网址是这样的:https://data.3dbag.nl/cityjson/v21031_7425c21b/3dbag_v21031_7425c21b_8044.json

此 URL 在我的浏览器中有效,但在 C# 中我收到 (404) Not Found 错误。有谁知道如何解决这个问题?

【问题讨论】:

请edit您的问题包含minimal reproducible example。 猜测:服务器需要一个 User-Agent 标头。无论如何,有一个简单的解决方案:使用 Telerik 的 Fiddler 之类的工具来比较浏览器发出的原始请求和 C# 发出的原始请求。 我很快就玩弄了“邮递员”,并注意到标头字段“Accept-Encoding”的值为“gzip”是必需的。 --> client.Headers.Add("Accept-Encoding", "gzip"); 现在在浏览器中按 F12。然后点击链接。然后查看右侧的“网络”选项卡中的“标题”->“请求标题”(将来可能会使用 cookie,尤其是在您登录后它是可用的资源时)。该“请求标头”列表是您的浏览器发送的使服务器成功响应的内容列表,即“有效的”,因此首先复制它。使用 Insomnia 之类的程序发出相同的请求,然后删除标头之一直到它停止,把它放回去并继续删除 otehrs 以达到最低限度(如果你在乎的话) 【参考方案1】:

看起来此服务器需要标头 Accept-Encoding: gzip:

using (var client = new WebClient())

    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
    string downloadUrl = "https://data.3dbag.nl/cityjson/v21031_7425c21b/3dbag_v21031_7425c21b_8044.json";
    string destinationFile = "test.json";
    client.Headers.Add("Accept-Encoding", "gzip"); //<-- add Header!
    client.DownloadFile(downloadUrl, destinationFile);

你会得到一个“压缩响应”。

所以你必须解压缩响应!

Compression/Decompression string with C#

【讨论】:

谢谢,添加这个标题就可以了! 解压结果有很多更好的方法:***.com/questions/2973208/…

以上是关于为啥当 URL 使用 Web 浏览器工作时,WebClient.DownloadFile 方法不起作用并显示“未找到 JSON”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Web 浏览器中工作的 url 没有在 UIImageview 中加载

浏览器/web-缓存知识点梳理

一篇图解带你快速的了解Web历史

Java Web

Web.xml:为啥安全约束中 url 模式的灵活性如此之差?

Web视图点击:在android中未检测到url,iOS工作:本机反应