为啥当 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 中加载