我正在创建一个连接到网站并从中下载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>

其他提示

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

  1. 解析服务器DNS条目的时间
  2. 下载代理的时间 autoconfig脚本,编译和 执行它来确定 有效代理
  3. 从您的应用到代理服务器的网络延迟(如果您的环境中有代理服务器)
  4. 来自的网络延迟 代理服务器到实际 目的地服务器。
  5. 延迟时间 服务器以提供XML 文献。如果它必须遍历一个 内存中的对象表示和 生成XML文档,即 可能需要一些时间。如果是的话 使用像 XML-Serialization生成 文件,然后取决于如何 序列化器配置,第一个 始终调用序列化/反序列化 由于事实,需要很长时间 中间组件需要 生成和编译。
  6. 在客户端解析XML 可能需要时间,尤其是XML 文档结构非常复杂。
  7. 如果是XLinq(比如XMLSerializer) 为XML生成临时程序集 解析&amp;查询,然后第一个 请求将花费更多的时间 后续的。
  8. 要确定哪个部分需要时间,请使用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服务器,它必须在您第一次查询时运行一些启动脚本。你提到第一个请求需要很长时间,但是你没说多长时间。这是否会导致一个大问题,即第一次请求需要这么长时间,还是只是一个烦恼?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top