【发布时间】:2017-10-23 12:24:15
【问题描述】:
我正在创建一个从网站获取信息的应用程序,该网站返回带有数据的单行文本。
为了得到这个,我只是使用WebClient.DownloadString()。这是代码:
{
WebClient Client = new WebClient();
Client.Proxy = null;
return Client.DownloadString(url);
}
问题在于,在第一次请求时,这个过程总是需要~21.000ms,下一个需要正常的时间。有类似的问题,人们似乎解决了这个问题,添加了Client.Proxy = null; 行,但它并没有解决我的问题。我的代理互联网设置被禁用,并且防火墙没有阻止任何东西(尝试禁用它)。
我也用google等不同的网站进行了测试(测试不是服务器问题),但结果是一样的。我也尝试过使用WebBrowser控件和HttpWebRequest,但结果也一样。
在常规浏览器(测试过的 edge、firefox 和 chrome)上加载相同的页面大约需要 200ms 并清除缓存。
使用wireshark我得到了这个,但我不知道如何解释它:
使用火狐:
TCP:
1. SYN (client-server)
2. SYN (client-server)
3. SYN ACK (server-client)
4. ACK (client-server)
5. SYN ACK (server-client)
6. ACK (client-server)
HTTP:
5. GET (client-server)
TCP:
7. ACK (server-client)
HTTP:
5. RESPONSE 200 OK (server-client) (The correct response is received)
TCP:
7. ACK (client server)
然后用我的程序:
我得到了完全相同的过程,但是通过 TCP 发送的第一个数据包使用 Ipv6 地址而不是 Ipv4,然后它等待 21 秒,然后是其余的数据包,实际的 HTTP GET-RESPONSE 时间应该很短。
【问题讨论】:
-
当与 http 服务器建立连接时,客户端和服务器之间会使用 http 标头进行协商,以获得通用的通信模式。例如,服务器默认为法语,客户端可能需要英语。然后服务器会将 URL 转发到另一个网页,这可能需要一些时间。此外,可能会在第一次连接时建立 cookie,然后后续连接将使用 cookie,因此使用 cookie 的响应将比没有 cookie 的初始连接更快。