2014-08-14 2 views
0

Я в настоящее время использую WebClient, чтобы открыть несколько сайтов, но через некоторое время я начинаю получать сообщения Error 403.
Я предполагаю, что это потому, что я часто нажимаю на их серверы. Я предполагаю, что все, что мне нужно сделать, это добавить промежуток времени между запросами Thread.Sleep.с использованием WebClient и получения ошибки 403

Поскольку мне приходится делать это много раз, есть предложение о том, как справиться с проблемой дросселирования, чтобы не потребовалось огромное количество времени?
Например, через 3 секунды между запросами в конечном итоге мне понадобится 3 часа.

Вопрос в том, является ли Thread.Sleep действительно правильным решением для этого? и если да, то для чего это хорошее время?

В качестве дополнительной заметки я также использовал HttpWebRequest и столкнулся с той же проблемой. Я до сих пор использовать его в других кодовых проектах и ​​технически надеюсь использовать то же решение (или близко к нему) для этих других кодов проектов использования HttpWebRequest

+0

Вы выполняете ваши запросы в последовательности? – esskar

+0

@esskar в настоящее время да, я. – shadonar

+0

Рассматривали ли вы чередование своих запросов, я имею в виду: учитывая, что на k сайтах вы должны открывать каждые T секунд, вы всегда открываете их в одной последовательности, в зависимости от того, как долго каждая операция «открыть» может занять некоторое время между Запросы. Будь то достаточно, чтобы избежать ошибки, о которой вы сообщали, это совсем другое дело. –

ответ

0

попробуй запустить запросы в параллельном предупреждении

public static void RunRequest(Uri uri, Action<string> onCompleted) 
{ 
    var client = new WebClient(); 
    client.DownloadStringCompleted += (sender, e) => onCompleted(e.Result); 
    client.DownloadStringAsync(uri); 
}; 

: код не testet, и я никогда не использовал WebClient

private const int _maxParallelRequest = 10; 
private int _requestCount = 0; 
private readonly object _sync = new object(); 
private ManualResetEvent _ev = new ManualResetEvent(false); 

while(true) 
{ 
    foreach (var uri in _allYourUris) 
    { 
     var wait = false; 
     lock (_sync) 
     { 
      if (_requestCount >= _maxParallelRequest) 
       wait = true; 
     } 

     if (!wait) 
     { 
      lock (_sync) { ++_requestCount; } 
      RunRequest(uri, r => { 
       lock (_sync) 
       { 
        --_requestCount; 
        _ev.Set(); 
       }  
       // handle r 
      }); 
      continue; 
     } 
     _ev.WaitOne(); 
    } 
    Thread.Sleep(3000); 
} 
Смежные вопросы