Долгое время загружать первое соединение в C # .NET - PullRequest
6 голосов
/ 12 сентября 2009

Я создаю программу, которая подключается к веб-сайту и загружает с него XML. Затем он отображает информацию для пользователя.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я впервые открываю программу и начинаю загружать информацию XML, это занимает очень много времени. Когда я загружаю другую страницу с сайта с открытой программой, загрузка занимает около полсекунды. Мне было интересно, есть ли способ избежать этого.

В настоящее время я использую HttpWebRequest для загрузки потока и StreamReader для его чтения. Затем я анализирую XML с помощью XLINQ.

Ответы [ 3 ]

14 голосов
/ 12 сентября 2009

Попробуйте явно установить прокси. Если вы не определили прокси, класс 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 голос
/ 14 сентября 2009

Первая задержка может быть вызвана сочетанием следующих факторов:

  1. Время для разрешения записи DNS сервера
  2. Время скачивать прокси сценарий автоконфигурации, компиляция и выполнить его, чтобы определить эффективный прокси
  3. задержка в сети от вашего приложения к прокси-серверу (если в вашей среде есть прокси-сервер)
  4. сетевая задержка от прокси-сервер для фактического целевой сервер.
  5. задержка на сервер для обслуживания XML документ. Если он должен пересечь представление объекта в памяти и генерировать XML-документ, который может занять некоторое время. Кроме того, если это используя такие методы, как XML-сериализация для генерации документ, то в зависимости от того, как настроен сериализатор, первый призыв к сериализации / десериализации всегда занимает много времени, из-за того, что что требуется промежуточная сборка быть сгенерированным и скомпилированным.
  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 .

Надеюсь, это поможет.

0 голосов
/ 12 сентября 2009

Возможно, вам придется провести дополнительное исследование, чтобы выяснить, какая часть запроса занимает больше времени при первом проходе. Мой первый инстинкт говорит, что запрос DNS на получение IP-адреса для указанного вами доменного имени занимает больше времени, поскольку он не кэшируется при первом запуске. Это может быть также веб-сервер на другом конце, который должен запускать некоторые сценарии запуска при первом запросе. Вы упомянули, что первый запрос занимает много времени, но вы не говорите, сколько времени. Это вызывает большую проблему, что для выполнения первого запроса требуется так много времени, или это просто раздражение?

...