并行进行http调用时未经授权的响应

时间:2015-06-18 16:31:08

标签: c# parallel-processing dotnet-httpclient

我有代码,我遍历一些服务并为这些服务调用api。如果我一次运行一个这样的呼叫,我会为每个呼叫得到OK(200)的响应StatusCode。如果我将代码更改为并行运行,则第一个完成的调用将获得OK,但剩余的调用全部完成且StatusCode值为Unauthorized(401)。

奇怪的是,所有的呼叫都是在服务器上实际处理的 - 甚至是我收到未经授权的响应的呼叫。我不明白发生了什么。

这是我正在运行的代码。 (并行代码目前已被注释掉)

using (HttpClientHandler handler = new HttpClientHandler())
{
    handler.UseDefaultCredentials = true;  // Use Windows Credentials
    using (var client = new HttpClient(handler))
    {
        //Some services can run up to 1.5 minutes - need to ensure we don't time out
        client.Timeout = new TimeSpan(0, 3, 0);

        //Get Available Services
        Console.WriteLine("Retrieving service list ...");
        var result = await client.GetStringAsync(_baseURL);

        var jss = new JavaScriptSerializer();
        List<Service> services = new List<Service>();
        services = jss.Deserialize<List<Service>>(result);
        Console.WriteLine(services.Count.ToString() + " services to run.");

        // ** Non Parallel Code **
        foreach(var service in services)
        {
            Console.WriteLine("Running " + service.Name);
            var _serviceResponse = await client.PostAsync(_baseURL + "/" + service.Id.ToString() + "/run", null);
            Console.WriteLine(service.Name + ": Response = " + _serviceResponse.StatusCode + "  " + _serviceResponse.ReasonPhrase);
        }

        //  ** Parallel Code **
        //await Task.WhenAll(services.Select(async s => {
        //        Console.WriteLine("Running " + s.Name);
        //        var _serviceResponse = await client.PostAsync(_baseURL + "/" + s.Id.ToString() + "/run", null);
        //        Console.WriteLine(s.Name + ": Response = " + _serviceResponse.StatusCode + "  " + _serviceResponse.ReasonPhrase);
        //}));
    }
}

}

根据我的阅读,HttpClient应该能够在使用Async(我正在做)时无问题地处理同时调用。所以我很好奇为什么它与这段代码的行为不同。

2 个答案:

答案 0 :(得分:1)

服务器是否可能对来自同一IP /用户的客户端请求应用某种速率限制,并在超过最大值时返回401?

答案 1 :(得分:0)

事实证明,我所呼叫的服务并不像那么快就会有很多请求。

我必须通过上传来填充在线列表,然后使用我的代码仅上传少量添加或删除。