6

我正在制作一个连接到网站并从中下载 XML 的程序。然后它将信息显示给用户。

我遇到的问题是当我第一次打开程序并开始下载 XML 信息时,它需要很长时间。当我从网站加载另一个页面时,程序仍然打开,下载大约需要半秒钟。我想知道是否有任何方法可以避免这种情况。

我目前使用 HttpWebRequest 下载流和 StreamReader 来读取它。然后我使用 XLINQ 浏览并解析 XML。

4

3 回答 3

14

尝试显式设置代理。如果您没有定义代理,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>
于 2009-09-12T01:33:32.870 回答
1

第一次延迟可能是由于以下原因的组合:

  1. 解析服务器 DNS 条目的时间
  2. 是时候下载代理自动配置脚本,编译并执行它以确定有效代理
  3. 从您的应用程序到代理服务器的网络延迟(如果您的环境中有代理服务器)
  4. 从代理服务器到实际目标服务器的网络延迟。
  5. 服务器上为 XML 文档提供服务的延迟。如果它必须遍历内存中的对象表示并生成 XML 文档,那可能需要一些时间。此外,如果它使用 XML-Serialization 之类的技术来生成文档,那么根据序列化程序的配置方式,第一次调用序列化/反序列化总是需要很长时间,因为需要生成中间程序集并编译。
  6. 在客户端解析 XML 可能需要一些时间,尤其是在 XML 文档结构非常复杂的情况下。
  7. 如果 Xlinq(如 XMLSerializer)为 XML 解析和查询生成临时程序集,那么第一个请求将比后续请求花费更多时间。

要确定哪个部分需要时间,请使用 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获取网络嗅探来进一步调查。

希望这可以帮助。

于 2009-09-14T16:07:28.150 回答
0

您可能需要做更多的研究来确定请求的哪一部分在第一次通过时花费的时间更长。我的第一直觉说,获取您指定的域名的 IP 地址的 DNS 请求需要更长的时间,因为它在第一次运行时没有被缓存。也可能是另一端的 Web 服务器,在您第一次查询它时必须运行一些启动脚本。你提到第一个请求需要很长时间,但你没有说多久。这是否会导致一个大问题,即第一个请求需要很长时间,还是只是一个烦恼?

于 2009-09-12T01:18:18.910 回答