我有代码,我遍历一些服务并为这些服务调用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(我正在做)时无问题地处理同时调用。所以我很好奇为什么它与这段代码的行为不同。
答案 0 :(得分:1)
服务器是否可能对来自同一IP /用户的客户端请求应用某种速率限制,并在超过最大值时返回401?
答案 1 :(得分:0)
事实证明,我所呼叫的服务并不像那么快就会有很多请求。
我必须通过上传来填充在线列表,然后使用我的代码仅上传少量添加或删除。