Странное время ожидания WebException в HTTP Get с использованием WebClient - PullRequest
1 голос
/ 25 июня 2009

У меня есть многопоточное приложение (в c #), которое умножает HTTP GET на uri. Внезапно после тысячи запросов я получаю тайм-аут webException, но целевой сервер в порядке, если я тестирую с помощью браузера. Код:

public static string Get(string uri)
{
    string responseData = string.Empty;
    using (WebClient wc = new WebClient())
    {
        responseData = wc.DownloadString(uri);
    }
    return responseData;
}

Я думаю, это проблема с подключением или аналогичная ошибка. У любого тела такая же проблема?

Спасибо заранее,

PS Я тоже использовал HttpWebResponse. Но я получаю ту же ошибку.

PS ОС - это сервер Windows 2003. Так что я думаю, что это не пределы подключения.

Я тоже пытался с этим кодом, и я получаю ту же ошибку

  public static string Get2(string uri)
    {
        string responseData = string.Empty;                
        WebRequest request = WebRequest.Create(uri) as HttpWebRequest;
        request.Method = "GET";
        request.Timeout = 35000;    
        using(HttpWebResponse response = (HttpWebResponse)request.GetResponse() as HttpWebResponse)
        {                   
            using(Stream dataStream = response.GetResponseStream ())
            {                   
                using(StreamReader reader = new StreamReader (dataStream))
                {
                    responseData = reader.ReadToEnd();                      
                }
            }
        }           
        return responseData;
    }

Ответы [ 4 ]

0 голосов
/ 21 июня 2016

Одна из возможностей: Исчерпание порта .

Вы создаете новый WebClient для каждого нового запроса.Это означает, что он будет получать новое TCP-соединение и порт при каждом запросе.На Windows-машине порты находятся только в 16-битном диапазоне, поэтому 0 - 65535, и ОС налагает дополнительные ограничения на этот диапазон.

Если вы сделаете NETSTAT -on a на вашем компьютере с Windows, вы увидитесписок соединений и назначенных им портов.

Проблема заключается в том, что порты возвращаются только через> 30 с, когда они переходят в состояние TIME_WAIT.Это означает, что если вы будете делать новый запрос каждые 30 секунд, у вас в конечном итоге закончатся порты, и произойдут плохие вещи.

Я рекомендую создать один WebClient и использовать его повторно.Вы можете не только избежать описанной выше проблемы, но и сделать ее более производительной.

0 голосов
/ 25 июня 2009

Это может быть вызвано любым числом причин, включая:

  • Кратковременная кратковременная потеря связи между вашим приложением и удаленный веб-сервер

  • Возможно, удаленный сервер не отвечает вовремя из-за нагрузки

Я предлагаю установить более длительное время ожидания для запроса, но вам нужно будет использовать WebRequest вместо этого, поскольку невозможно установить время ожидания на WebClient.

0 голосов
/ 27 июня 2009

Столкнувшись с этим сам, я обнаружил, что сработал, пытаясь выполнить запрос get несколько раз после короткого ожидания () в этом потоке, скажем, 5 секунд, и, если он не работает, лучше оставить сервер в покое. на некоторое время. : -)

0 голосов
/ 25 июня 2009

Быстрый вопрос (ы)

  1. Является ли сервер также вашим кодом?
  2. Сколько многократных запросов?
  3. Попробуйте ping -t на вашем сервере и посмотреть, сообщается ли потеря пакетов с вашего клиентского компьютера.

Задумывались ли вы, может быть, сервер исчерпал все свои ресурсы для обработки ваших запросов и просто и просто перезапускает себя. Вот почему вы получаете тайм-аут, когда вы делаете запрос, но к тому времени, когда вы делаете браузер ping , он резервируется. Просто мысль

Поскольку вы упоминаете «тысячи запросов», я больше склонен думать о нехватке ресурсов на сервере, а не о подключении.

...