好的,经过大量调查后,我决定必须由服务器在请求中查找特定标头。因此,我检查了大多数浏览器发送的内容,复制了这些内容,然后最终将其缩减为需要的服务器all存在以下标题:
client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
client.DefaultRequestHeaders.Add("Accept-Language", "en-GB,en;q=0.9,en-US;q=0.8");
删除其中任何一项,服务器都不会响应。很奇怪!
感谢所有看过这篇文章的人,我希望这个答案可以帮助将来的人:)
编辑-更奇怪
好吧,奇怪的事情现在还在继续,因为尽管这解决了本地运行的问题(在 VS 2017 中使用 IIS Express),但在部署到实时环境(在 IIS 7.5 / Windows Server 中运行)时仍然无法工作。与控制台应用程序版本相同 - 适用于本地 PC,不适用于服务器。尝试了 3 台 Windows 服务器,相同的代码,它在其中一台上运行,但在另外两台上不起作用。太奇怪了。
进一步编辑 - 决议?
所以进一步阅读后出现某些网络服务器 https://gwillem.gitlab.io/2017/05/02/http-header-order-is-important/, 例如阿卡迈幽灵(托管有问题的域)有一些相当复杂的“机器人”检测,它拒绝来自未知客户端的连接。措施包括检查 HTTP 请求标头的顺序,以便它们与用户代理通常发送的内容匹配(即,如果您将用户代理字符串伪造为 Chrome,则最好采取行动)exactly像 Chrome 一样,按照 chrome 的顺序发送标头并接受相同的内容类型等)。
在尝试伪造大量浏览器用户代理字符串后,我最终发现“假装”为 Google PageSpeed 机器人是有效的。将用户代理字符串设置为:“Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google Page Speed Insights) Chrome/27.0.1453 Safari/537.36
"
无论使用什么版本的 Windows 服务器或 .NET Framework,这似乎都有效。
我最终想出的标题是:
this.Client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/apng,*/*;q=0.8");
this.Client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
this.Client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
this.Client.DefaultRequestHeaders.Add("Accept-Language", "en-GB,en;q=0.9,en-US;q=0.8");
this.Client.DefaultRequestHeaders.Add("Connection", "keep-alive");
this.Client.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
this.Client.DefaultRequestHeaders.Add("Pragma", "no-cache");
this.Client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google Page Speed Insights) Chrome/27.0.1453 Safari/537.36");