C#.NETで最初の接続をロードするのに時間がかかる
-
06-07-2019 - |
質問
ウェブサイトに接続し、そこからXMLをダウンロードするプログラムを作成しています。次に、情報をユーザーに表示します。
私が抱えている問題は、最初にプログラムを開いてXML情報のダウンロードを開始するときに、非常に長い時間がかかることです。プログラムを開いたままサイトから別のページを読み込むと、ダウンロードに約0.5秒かかります。これを回避する方法があるかどうか疑問に思っていました。
現在、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シリアル化 文書、その後、どのように シリアライザーが構成され、最初の 常にシリアライズ/デシリアライズするための呼び出し 事実のために長い時間がかかります 中間アセンブリに必要なもの 生成およびコンパイルされます。
- クライアント側での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サーバーでもかまいません。最初のリクエストには長い時間がかかるとおっしゃいましたが、どのくらいの長さかは言いません。これは、最初の要求を行うのに時間がかかるという大きな問題を引き起こしていますか、それとも単に迷惑ですか?