【问题标题】:using WebClient and receiving Error 403使用 WebClient 并收到错误 403
【发布时间】:2014-08-14 23:22:10
【问题描述】:

我目前正在使用WebClient 打开一些网站,但一段时间后我开始收到Error 403 消息。
我假设这是因为我经常/快速地访问他们的服务器。我假设我需要做的就是在请求之间添加一个Thread.Sleep 时间范围。

由于我必须多次执行此操作,是否有关于如何处理节流问题而不必花费大量时间的建议?
例如,请求之间的 3 秒最终将花费我 3 小时来完成。

所以问题是,Thread.Sleep 真的是解决这个问题的正确方法吗?如果是,什么是合适的时间范围?

作为旁注,我也使用了HttpWebRequest 并遇到了同样的问题。我仍然在其他代码项目中使用它,并且从技术上讲,我希望将相同的解决方案(或接近它)用于使用 HttpWebRequest

的其他代码项目

【问题讨论】:

  • 您是否按顺序运行您的请求?
  • @esskar 目前是的。
  • 您是否考虑过交错您的请求,我的意思是:给定 k 个网站,您必须每 T 秒打开一次,您总是以相同的顺序打开它们,具体取决于每个“打开”操作需要多长时间这可能会给您一些请求之间的时间。是否足以避免您报告的错误是完全不同的问题。
  • 您是否必须首先通过这些网站中的任何一个进行身份验证?
  • @AndreaScarcella 所以你的意思是做网站 1,然后是 2,然后是 3,然后是 4,然后是 5,然后是 1,然后是 2,等等。不管每个网站有多少项目?跨度>

标签: c# webclient


【解决方案1】:

尝试并行运行请求

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);
}

【讨论】:

    猜你喜欢
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2018-05-05
    • 2013-11-12
    • 2018-05-11
    相关资源
    最近更新 更多