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

本文关键字:授权 响应 http 调用 并行 | 更新日期: 2023-09-27 17:57:10

我有代码循环访问某些服务并调用这些服务的 api。 如果我一次运行一个这些调用,则每次调用的响应StatusCode为 OK (200)。 如果我将代码更改为并行运行,则完成的第一个调用将获得 OK,但其余调用都以StatusCode值"未授权 (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 时毫无问题地处理同时调用(我正在这样做)。 所以我很好奇为什么它与这段代码的行为不同。

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

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

事实证明,我调用的服务不喜欢那么快收到那么多请求。

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