2010-10-23 4 views
2

Я создал программу, которая загружает данные из HTTP-запроса. Необходимо загрузить его через каждые 1 сек. Или 0,25 с..Я продолжаю получать ошибки «Timed Out» на C# WebRequest

Однако я обнаружил, что многие из моих запросов - несколько раз в минуту - приурочены. Странно, потому что, пытаясь перезагрузить один и тот же адрес в веб-браузере, даже при перезагрузке очень часто, я всегда получаю содержимое быстро.

Это код, я использую:

 HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url); 
     myRequest.Method = "GET"; 
     myRequest.Timeout = 1500; 
     myRequest.KeepAlive = false; 
     myRequest.ContentType = "text/xml"; 
     WebResponse myResponse; 
     try 
     { 
      myResponse = myRequest.GetResponse(); 
     } 
     catch (Exception e) 
     { 
      return e.Message; 
     } 
     StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8); 
     string result = sr.ReadToEnd(); 
     sr.Close(); 
     myResponse.Close(); 

И ошибка я получаю:

The operation has timed out 

Я пробовал как с набором оставайся в живых к истинным и ложным.

Итак, вопрос в том, есть ли способ уменьшить количество тайм-аутов? Каждый запрос, который я запрашиваю, имеет решающее значение. Я уверен, что это относится к тому, что я часто запрашиваю тот же адрес, но, конечно, есть способ предотвратить его ...?

Большое спасибо!

+0

У вас есть контроль над веб-сервером? Где это? Сколько контента это рендеринг? > 1,5 секунды - это не очень редко. – Jeff

+0

нет контроля, но он очень близок мне. Пинг, который я получаю с сервера, составляет 13 мс, а содержание - около 350 байтов. – BenB

+0

13ms ping не имеет никакого отношения к времени, затрачиваемому на обслуживание страницы веб-сервером. Если вы удалите код тайм-аута, будет ли он еще отключен? Выполняется ли на нескольких потоках опция? – realworldcoder

ответ

1

Существует два вида тайм-аутов. Таймаут клиента и таймаут сервера. Здесь вы получаете время ожидания сервера, которое, вероятно, связано с механизмом защиты безопасности (IDS/IPS) с веб-сервера, поскольку он распознает шаблон (большое количество запросов от одного IP в течение небольшого периода времени) как DoS (отказ в обслуживании)) атака. Затем ваш IP запрещен на некоторое время. Увеличение времени ожидания клиента, как и в вашем коде, не является полезным в этом случае. @Comment: Отключение KeepAlive заставляет приложение создавать новое подключение к веб-серверу по каждому запросу. Возможно, это большая разница между вашим кодом и запуском javascript из браузера. Установите KeepAlive равным true.

App.Config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<system.net> 
<connectionManagement> 
<add address = "*" maxconnection = "1000" /> 
</connectionManagement> 
</system.net> 
</configuration> 
+0

Спасибо за ответ, это имеет смысл - однако тот же сервер, на который я запрашиваю данные, имеет очень похожий метод Javascript, который делает то же самое на веб-странице. Он загружает один и тот же XML каждые 1 секунду. Javascript никогда, кажется, не сбой, хотя .. – BenB

+0

На этом мы уверены, что ваш запрос не получает ответа. Начиная со своей стороны, проверьте свой брандмауэр, скорость соединения, ... Если все в порядке с вашей стороны, проверьте разницу между запросом и тем, что делает этот Javascript. Отключение Сохранение в живых - это не очень хорошая идея, так как ваше приложение будет пытаться подключать большее количество подключений, а может быть, добавить «MaxConnection» в ваш app.config. – Xaqron

0

Попробуйте установить тайм-аут для Timeout.Infinite:

var request = WebRequest.Create(url); 
     request.Proxy = null; 
     request.Timeout = Timeout.Infinite; 
     string text = ""; 
     using (var response = (HttpWebResponse)request.GetResponse()) 
     { 
      using (var sr = new StreamReader(response.GetResponseStream())) 
      { 
       text = sr.ReadToEnd(); 
      } 
     }