我尝试使用WebClient下载网页,但它挂起,直到达到WebClient中的超时,然后失败并出现异常。
以下代码将不起作用
WebClient client = new WebClient();
string url = "https://www.nasdaq.com/de/symbol/aapl/dividend-history";
string page = client.DownloadString(url);
如果使用不同的URL,则传输工作正常。
WebClient client = new WebClient();
string url = "https://www.ariva.de/apple-aktie";
string page = client.DownloadString(url);
完成得非常快,并在页面变量中包含整个html.
使用HttpClient或WebRequest/WebResponse在第一个URL上得到相同的结果:阻塞,直到出现超时异常。
这两个URL在浏览器中都能很好地加载,大约需要2-5秒钟。知道问题出在哪里吗,有什么解决方案吗?
我注意到,在Windows窗体对话框中使用WebBrowser控件时,第一个URL加载时会出现20多个javascript错误,需要单击确认。当在浏览器中打开开发人员工具访问第一个URL时,也会出现同样的情况。
然而,WebClient不会对它得到的返回进行操作。它不运行JavaScript,也不加载引用的图片、CSS或其他脚本,所以这应该不是问题。
谢谢你!
拉尔夫
2条答案
按热度按时间fjaof16o1#
第一个站点
"https://www.nasdaq.com/de/symbol/aapl/dividend-history";
需要:= SecurityProtocolType.Tls12
此处的
User-agent
很重要。如果在WebRequest.UserAgent中指定了最新的User-agent
,网站可能会激活Http 2.0
协议和HSTS
(HTTP Strict Transport Security)。只有最新的浏览器(作为参考,FireFox 56或更高版本)才支持/理解这些协议。必须使用较旧的浏览器作为
User-agent
,否则网站将期待(并等待)* 动态 * 响应。使用 * 较旧的 *User-agent
,网站将激活Http 1.1
协议,而不会激活HSTS。第二个站点
"https://www.ariva.de/apple-aktie";
需要:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
我建议这样设置WebRequest(或相应的HttpClient设置):
(WebClient * 可以 * 工作,但可能需要派生的自定义控件)
第一个WebSite(
nasdaq.com
)返回的负载长度为101.562
字节第二个WebSite(
www.ariva.de
)返回的负载长度为56.919
字节7fhtutme2#
很明显,下载该链接有问题(不正确的url,unothorized访问,...),但是您可以使用异步方法来解决socking部分: