Вопрос

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

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

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

Это было полезно?

Решение

Попробуйте явно настроить прокси. Если вы не определили прокси, класс 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 сервера
  • Время для загрузки прокси сценарий автоконфигурации, компиляция и выполнить его, чтобы определить эффективный прокси
  • задержка в сети от вашего приложения к прокси-серверу (если в вашей среде есть прокси-сервер)
  • задержка в сети от прокси-сервер для фактического целевой сервер.
  • задержка на сервер для обслуживания 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);
    

    Вы можете вставить цикл вокруг этого и посмотреть, в чем разница между различными компонентами между первым и последующими запросами.

    Если вы обнаружите, что разница заключается в загрузке, а не в запросах, то вы можете продолжить расследование, проанализировав сеть с помощью

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

    scroll top