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