2009-09-12 15 views
6

私は、Webサイトに接続し、そこからXMLをダウンロードするプログラムを作っています。その後、ユーザーに情報を表示します。C#.NETで初めての接続をロードするのに長時間がかかる

私が抱えている問題は、最初にプログラムを開いてXML情報のダウンロードを開始するときに非常に時間がかかることです。プログラムを開いたまま別のページをサイトから読み込むと、ダウンロードに約0.5秒かかります。私はこれを避ける方法があれば疑問に思っていた。

私は現在、ストリームをダウンロードするのにHttpWebRequestを使用し、それを読むためにStreamReaderを使用します。それから、XLINQを使ってXMLを解析します。

+1

遅延は、初めてXMLを扱うウェブサイトに当たったときだけです。つまり、その後のヒットでXMLをすばやく取得しますか?もしそうなら、それはXMLを提供するWebアプリケーションの最初の起動遅延かもしれません... –

+0

私はアップデートをチェックしている間に私のアップデートサーバでも起こります。私はhttp://google.comに接続してみました。それでも同じことをしました。 HttpWebRequestの代わりにWebClientを使用しても同じ結果が得られます。 – Christian

+0

ああ、また、すべてのサーバーに接続すると、他のすべてのサーバーが高速に読み込まれます。 – Christian

答えて

14

プロキシを明示的に設定してください。プロキシが定義されていない場合、HttpRequestクラスは1時間の検索に時間を費やします。一度それが見つかる(または見つからない)と、アプリケーションの存続期間中にその情報が使用され、後続の要求がスピードアップされます。

<system.net> 
    <defaultProxy 
    enabled="false" 
    useDefaultCredentials="false" > 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 
+2

これまでの彼の言葉によれば、これは最善の説明のように聞こえる。キリスト教が見つけたことを知りたい。 – JoshBerke

+4

これはうまくいった!ありがとうございました:) – Christian

+1

@Rex M:ありがとう、この問題は私を夢中にさせていました。 –

0

おそらく、最初のパスで要求のどの部分が長くかかっているかを把握するためには、さらに調査する必要があります。私の最初の本能は、あなたが指定したドメイン名のIPアドレスを取得するためのDNSリクエストは、最初に実行されたときにキャッシュされないので、より長い時間がかかります。もう一方のWebサーバーでも、最初にクエリを実行するときに起動スクリプトを実行する必要があります。最初のリクエストには長い時間がかかりますが、あなたはどれくらいの時間がかかりません。これは、最初のリクエストを行うのにそれほど時間がかかり、大きな問題を引き起こしていますか、それともちょっと迷惑ですか?

+0

上記の私のコメントをGuy Starbuckに返信してください。どのくらいの間、それは変化するが、通常どこでも15から45秒までである。それは大きな問題ではありませんが、特にプログラムをWindows Mobileに移植するときには迷惑です。 – Christian

+1

"15〜45秒"は、DNSルックアップがアプリを起動するたびに長時間かかることは事実上ありません。 –

1

遅延が原因次の組み合わせにすることができ、初めて:サーバーのDNSを解決するための

  1. 時間をあなたはまた、.configファイルでこれを定義することができます

    //internally sets "ProxySet" to true, so won't search for a proxy 
    request.Proxy = null; 
    

    エントリ

  2. autoconfigスクリプトをダウンロードし、 を実行して012を特定する時刻プロキシサーバーへのアプリから効果的なプロキシ
  3. ネットワークレイテンシ実際 先サーバーへ プロキシサーバから
  4. ネットワークレイテンシ(ご使用の環境でプロキシサーバがある場合)。
  5. のサーバーでXML ドキュメントを配信するまでの待ち時間。 のメモリ内オブジェクト表現をトラバースし、 がXML文書を生成する場合は、 に時間がかかることがあります。それは 文書を生成する XML-シリアル化のような技術を使用して ある場合も、その後、 シリアライザが設定されている方法に応じて、デシリアライズ/シリアライズする最初の の呼び出しは常に は という事実に、長い時間がかかります中間アセンブリは、 を生成してコンパイルする必要があります。
  6. XML の文書構造が非常に複雑な場合は、クライアント側でXMLを解析すると、時間がかかることがあります。
  7. (XmlSerializerを等)XLinq は、第1 要求は、後続のものよりも多くの時間がかかり、&クエリを解析する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を使用してネットワークスニッフィングを取得してさらに調査することができます。

これが役に立ちます。

関連する問題