C# 使用WebClient和接收错误403
我目前正在使用C# 使用WebClient和接收错误403,c#,webclient,C#,Webclient,我目前正在使用WebClient打开一些网站,但一段时间后,我开始收到错误403消息。 我认为这是因为我频繁/快速地访问他们的服务器。我假设我所需要做的就是在请求之间添加一个线程。Sleep时间范围 因为我已经做了很多次了,有没有关于如何在不花费大量时间的情况下处理节流问题的建议? 例如,两次请求之间的3秒将花费我3个小时的时间 所以问题是,Thread.Sleep真的是解决这个问题的正确方法吗?如果是的话,什么是一个好的时间框架 作为旁注,我还使用了HttpWebRequest,遇到了同样的问
WebClient
打开一些网站,但一段时间后,我开始收到错误403
消息。我认为这是因为我频繁/快速地访问他们的服务器。我假设我所需要做的就是在请求之间添加一个
线程。Sleep
时间范围
因为我已经做了很多次了,有没有关于如何在不花费大量时间的情况下处理节流问题的建议?例如,两次请求之间的3秒将花费我3个小时的时间 所以问题是,
Thread.Sleep
真的是解决这个问题的正确方法吗?如果是的话,什么是一个好的时间框架
作为旁注,我还使用了
HttpWebRequest
,遇到了同样的问题。我仍然在其他代码项目中使用它,从技术上讲,我希望在其他代码项目中使用相同的解决方案(或接近它),使用HttpWebRequest
尝试并行运行请求
public static void RunRequest(Uri uri, Action<string> onCompleted)
{
var client = new WebClient();
client.DownloadStringCompleted += (sender, e) => onCompleted(e.Result);
client.DownloadStringAsync(uri);
};
您是否按顺序运行请求?@esskar目前是的。您是否考虑过交错请求,我的意思是:给定每T秒必须打开的k个网站,您总是按相同的顺序打开它们,这取决于每个“打开”操作需要多长时间。这可能会给您一些请求之间的时间。不过,这是否足以避免您报告的错误是一个完全不同的问题。您必须首先通过这些网站中的任何一个进行身份验证吗?@AndreaScarcella那么您的意思是,对于每个网站的项目数,请执行网站1、2、3、4、5、1、2等操作?
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);
}