带有WebRequest的Parallel.foreach()。 429错误

时间:2017-06-21 13:59:09

标签: c# asp.net asp.net-web-api webrequest parallel.foreach

我目前正在运行一个脚本,该脚本在很长一段时间内大约会击打api大约3000次。我正在使用parallel.foreach(),以便我可以一次发送一些请求来加快进程。我在每个foreach迭代中创建了两个请求,所以我的请求不应超过10个。我的问题是我一直收到来自服务器的429个错误,并且我与管理服务器的人交谈,他们说他们正在看到40多个爆发的请求。根据我目前对我的代码的理解,我不相信这甚至是可能的,有人可以让我知道如果我在这里遗漏了什么吗?

    public static List<Requests> GetData(List<Requests> requests)
    {
        ParallelOptions para = new ParallelOptions();
        para.MaxDegreeOfParallelism = 5;

        Parallel.ForEach(requests, para, request =>
        {
            WeatherAPI.GetResponseForDay(request);
        });

        return requests;
    }

    public static Request GetResponseForDay(Request request)
    {
        var request = WebRequest.Create(request);
        request.Timeout = 3600000;
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader myStreamReader = new 
        StreamReader(response.GetResponseStream());
        string responseData = myStreamReader.ReadToEnd();
        response.Close();

        var request2 WebRequest.Create(requestthesecond);
        HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse();
        StreamReader myStreamReader2 = new 
        StreamReader(response2.GetResponseStream());
        string responseData2 = myStreamReader2.ReadToEnd();
        response2.Close();

        DoStuffWithData(responseData, responseData2)

        return request;
    }

2 个答案:

答案 0 :(得分:1)

正如smartobelix指出的那样,你的并行度设置为5并不会阻止你发送服务器端策略所定义的太多请求。它所做的就是阻止你耗尽这些请求所需的线程数量。所以你需要做的是与服务器所有者沟通,熟悉他们的限制并更改你的代码永远不会达到极限。

涉及的变量是:

  1. 您要发送的并发请求数(并行性)
  2. 一个请求的平均时间
  3. 服务器允许的每单位时间的最大请求数
  4. 因此,例如,如果您的平均请求时间是200毫秒,并且您的最大并行度为5,那么您平均每秒可以发送25个请求。如果每个请求需要500毫秒,那么你只会发送10个。

    混合服务器允许数字进入,你就会明白如何微调数字。

答案 1 :(得分:1)

上述两个答案基本上都是正确的。我遇到的问题是服务器管理员设置了100个请求/分钟的速率限制,而以前没有一个,并且没有通知我。一旦达到100个请求/分钟的限制,我几乎立即开始接收429个错误,并开始以该速度发出请求,这也是收到429个错误。

相关问题