Я продолжаю получать «Timed Out» ошибки на C # WebRequest - PullRequest
3 голосов
/ 24 октября 2010

Я создал программу, которая загружает данные из HTTP-запроса. Он должен загружать его каждые 1 секунду или 0,25 секунды .

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

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

        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

Я пытался установить для обоих keepalive значение true и false.

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

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

Ответы [ 2 ]

1 голос
/ 14 февраля 2013

Попробуйте установить время ожидания на Время ожидания. Бесконечно :

    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();
            }
        }
1 голос
/ 24 октября 2010

Есть два вида таймаутов. Тайм-аут клиента и сервера. Здесь вы получаете тайм-аут сервера, который, вероятно, связан с механизмом защиты безопасности (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>
...