我正在制作一个连接到网站并从中下载 XML 的程序。然后它将信息显示给用户。
我遇到的问题是当我第一次打开程序并开始下载 XML 信息时,它需要很长时间。当我从网站加载另一个页面时,程序仍然打开,下载大约需要半秒钟。我想知道是否有任何方法可以避免这种情况。
我目前使用 HttpWebRequest 下载流和 StreamReader 来读取它。然后我使用 XLINQ 浏览并解析 XML。
我正在制作一个连接到网站并从中下载 XML 的程序。然后它将信息显示给用户。
我遇到的问题是当我第一次打开程序并开始下载 XML 信息时,它需要很长时间。当我从网站加载另一个页面时,程序仍然打开,下载大约需要半秒钟。我想知道是否有任何方法可以避免这种情况。
我目前使用 HttpWebRequest 下载流和 StreamReader 来读取它。然后我使用 XLINQ 浏览并解析 XML。
尝试显式设置代理。如果您没有定义代理,HttpRequest
该类将花时间搜索一个。一旦找到(或未找到),它将在应用程序的整个生命周期中使用该信息,从而加快后续请求。
//internally sets "ProxySet" to true, so won't search for a proxy
request.Proxy = null;
您也可以在 .config 中定义它:
<system.net>
<defaultProxy
enabled="false"
useDefaultCredentials="false" >
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>
第一次延迟可能是由于以下原因的组合:
要确定哪个部分需要时间,请使用 System.Diagnostics.Stopwatch() 将一些时间记录到您的代码中:
// this is the time to get the XML doc from the server, including the time to resolve DNS, get proxy etc.
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
timer.Start();
HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
timer.Stop();
Console.WriteLine("XML download took: " + timer.ElapsedMilliseconds);
timer.Start();
// now, do your XLinq stuff here...
timer.Stop();
Console.WriteLine("XLinq took: " + timer.ElapsedMilliseconds);
您可以围绕它插入一个循环,并查看第一个请求和后续请求之间各种组件的区别是什么。
如果您发现差异在于下载而不是查询,那么您可以通过使用Wireshark获取网络嗅探来进一步调查。
希望这可以帮助。
您可能需要做更多的研究来确定请求的哪一部分在第一次通过时花费的时间更长。我的第一直觉说,获取您指定的域名的 IP 地址的 DNS 请求需要更长的时间,因为它在第一次运行时没有被缓存。也可能是另一端的 Web 服务器,在您第一次查询它时必须运行一些启动脚本。你提到第一个请求需要很长时间,但你没有说多久。这是否会导致一个大问题,即第一个请求需要很长时间,还是只是一个烦恼?