簡體   English   中英

長時間加載C#.NET中的第一個連接

[英]Long time to load first connection in C# .NET

我正在制作一個連接到網站並從中下載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. 是時候下載代理自動配置腳本,對其進行編譯和執行以確定有效的代理了
  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獲得網絡嗅探來進一步調查。

希望這可以幫助。

您可能需要做更多的研究才能弄清楚請求的哪一部分在第一遍中花費的時間更長。 我的第一個直覺是說,獲取您指定的域名的IP地址的DNS請求花費的時間更長,因為它不是在第一次運行時就被緩存的。 另一端的Web服務器也可能是您第一次查詢時必須運行一些啟動腳本的Web服務器。 您提到第一個請求需要很長時間,但是您沒有說多長時間。 這是否會引起一個大問題,即需要很長時間才能完成第一個請求,還是很煩人?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM