多个HTTP请求触发HTTP Client超时

2024-02-22

我有一个异步发送 500 个 HTTP 请求的应用程序。所有请求均已处理after由于 HTTP 客户端超时,15 秒失败,even当请求的端点已返回 200 OK 时。

代码非常简单。这里我们获取一大块请求(500),并异步执行它们。应该注意的是,下面的函数是在基于消耗的计划上运行的 Azure 函数。

    public async Task RunBatch(List<Request> requests)
    {
        if (requests != null && requests .Count > 0)
        {
            var tasks = new Task[requests.Count];
            var i = 0;
            foreach (var request in requests)
            {
                var request = new HttpRequestMessage(HttpMethod.Post, new Uri(request.Url));
                request.Content = new StringContent(request.BodyString, Encoding.UTF8, "application/json");
                tasks[i] = _httpClient.SendAsync(request);
                i++;
            }

            await Task.WhenAll(tasks);
        }
    }

我的构造函数中存在以下代码

_httpClient = new HttpClient();
_httpClient.Timeout = new TimeSpan(0, 0, 15); // 15 seconds

以下是来自 Azure 的日志。

我希望每个请求都有 15 秒的超时时间。但是,每当我的服务器开始处理等待的请求时,我都需要它给我一个准确的响应代码。这可能吗?

我应该注意:使用较高的 Http 超时(1 分钟),所有请求都会成功。


就我个人而言,我认为尝试发出 500 个并发请求总是容易出错。您提到您正在异步执行此操作,但实际上,当您启动 500 个“热门”任务然后等待它们全部完成时,您的代码中并没有太多异步性。

我会使用信号量来控制一次可以发出多少个请求。您可能需要玩弄数字才能找到最佳点。

以下代码在 LINQPad 中运行良好(尽管 bing 很快注意到奇数个请求并开始向页面添加验证码):

// using System.Threading;
async Task Main()
{
    var httpClient = new HttpClient();
    var urls = Enumerable.Range(1, 500).Select(e => "https://www.bing.com/").ToList();
    
    // 10 concurrent requests - tweak this number
    var semaphore = new SemaphoreSlim(10, 10);
    
    var tasks = urls.Select(u => MakeRequest(u, semaphore, httpClient));
        
    var allResponses = await Task.WhenAll(tasks);
    
    // Do something with allResponses
}

private async Task<string> MakeRequest(string url, SemaphoreSlim semaphore, HttpClient httpClient)
{
    try
    {
        await semaphore.WaitAsync();
        var request = new HttpRequestMessage(HttpMethod.Get, new Uri(url));
        var response = await httpClient.SendAsync(request);
        
        // Add an optional delay for further throttling:
        //await Task.Delay(TimeSpan.FromMilliseconds(100));
        
        return await response.Content.ReadAsStringAsync();
    }
    finally
    {
        semaphore.Release();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个HTTP请求触发HTTP Client超时 的相关文章

随机推荐

  • iOS,我应该在项目中设置什么体系结构设置?

    对我的应用程序进行一些细微修改并将其加载到最新的 xcode 版本后 我注意到以下设置 我应该删除armv6吗 下拉菜单中的选项显示armv7 armv7s 我应该设置什么 如果你真的不想支持 iPhone3G和更低 不3GS 然后你可以删
  • 在 ios 9.1 中使用什么来代替 UIScreen.mainScreen().applicationFrame 进行 swift ?

    这可能是一个简单的问题 但由于我是初学者 最好问一下 正如标题所说 我应该使用什么来代替UIScreen mainScreen applicationFrame因为它在 9 0 中已被弃用 如果可能的话 如果你能给我提供一个样本或例子 那就
  • 有没有办法用茉莉花验证间谍执行的顺序?

    我有两个对象已被 Jasmine 设置为间谍 spyOn obj spy1 spyOn obj spy2 我需要验证调用spy1在致电之前来spy2 我可以检查它们是否都被调用 expect obj spy1 toHaveBeenCalle
  • 如何使用Java在线下载mp3文件?

    我使用以下方法下载 mp3 文件 http online1 tingclass com lesson shi0529 43 32 mp3 http online1 tingclass com lesson shi0529 43 32 mp3
  • 如何在x86汇编的数据段中写入常量

    我正在编写一个汇编程序 使用 icc 作为汇编器 我需要在数据部分编写一些常量 以便在主程序中进行相对加载 例如以下指令 vmovdqu msg rip ymm0 我现在将数据部分写成这样 data msg 0x00000000 0x010
  • 使用 Swift 将字符串转换为 Int

    该应用程序基本上通过输入初始速度和最终速度以及时间来计算加速度 然后使用公式来计算加速度 但是 由于文本框中的值是字符串 因此我无法将它们转换为整数 IBOutlet var txtBox1 UITextField IBOutlet var
  • 如何管理grails中多个表的分页?

    我的 gsp 页面中有两个表 部分 我需要在它们上实现分页 表 节的每页中的记录数不同 例如 第一个表应每页显示 10 条记录 第二个表 节应每页显示 7 条记录 我使用标签来实现它 当我这样做时 我遇到了很多问题 如下所述 最初 它显示每
  • 设置应用程序图标 (Xcode 7)

    我环顾四周 我发现的其他主题都没有解决我在应用程序图标中遇到的错误 当我尝试运行我的应用程序时 出现错误 名为 AppIcon 的应用程序图标集没有任何适用的内容 我很确定这是因为我没有将 png 文件放在正确的位置 但我不知道将其放在哪里
  • 在 Rails 4 中发送带有远程 true 的表单

    我有一个用于更新图像的表格 该行动有 respond to do format format js format html end 但我收到以下错误 ActionView MissingTemplate Missing template u
  • 使用 For 循环在 Oracle 过程中检索多行

    我正在处理存储过程 我需要检索一组结果并单独处理每个元素 然后返回整个结果 使用 3 个不同的表 我对数据库不太熟悉 但这就是我能想到的 create or replace procedure GET EMP RSLT IS CURSOR
  • 当您收到通用 SoapException:服务器无法处理请求时,如何缩小实际问题的范围。来自MS-CRM 4.0

    我最近开始针对 CRM 4 0 进行编程 并使用 CrmService 发出这些请求 当我发送请求时 我经常在使用的动态实体的某些属性中得到错误的值 当然请求失败了 我拦截异常并记录它 问题是这就是我得到的 System Web Servi
  • Lua 匹配字符串中字符后的所有内容

    我是 Lua 新手 不太了解模式匹配 我试图弄清楚如何匹配冒号后字符串中的所有内容 并将字符串的该部分放入变量中 我在网上浏览的运气不太好 或者也许我只是没有看到它 那么我该怎么做呢 例如 假设我有一个名为my string等于 hello
  • Discord.py 获取自定义状态

    如何通过discord py获取Discord用户自定义状态 我看过discord py 文档 我唯一能找到的是Member status https discordpy readthedocs io en latest api html
  • 为什么除法结果会根据强制转换类型而有所不同? (跟进)

    这是这个问题的后续 为什么除法结果会根据强制转换类型而有所不同 https stackoverflow com questions 25703304 why does a division result differ based on th
  • C++11 向量构造函数复制与范围?

    我无法理解向量复制构造函数和范围构造函数之间的优点或区别 当我像这样构造三个向量时 vector
  • 如何禁用 React Native 中的警告?

    我知道警告很重要 但出于特定原因 我不希望它们出现在屏幕上 如何禁用出现的黄色警告screen console disableYellowBox已被弃用 取而代之的是LogBox ignoreAllLogs 在index js中只需设置 i
  • 如何在 Pandas 中创建 SparseDataFrame?

    pandas DataFrame a Out 41 1 2 3 0 1 2 NaN 1 1 NaN 3 a 1 1 0 2 2 0 1 1 0 3 3 0 pandas DataFrame a Out 43 1 2 3 0 1 2 NaN
  • Qt 中的 GIF 动画

    我用过QGraphicsView QGraphicsScene类以便在小部件中显示图片 如下所示 m Scene gt addPixmap QPixmap fileName m View gt setScene m Scene 我如何展示
  • CSS calc 在 IE11 中无法使用线性渐变

    margin 0 padding 0 body background color orangered content margin top 200px height 100vh background color fdfdff tilt po
  • 多个HTTP请求触发HTTP Client超时

    我有一个异步发送 500 个 HTTP 请求的应用程序 所有请求均已处理after由于 HTTP 客户端超时 15 秒失败 even当请求的端点已返回 200 OK 时 代码非常简单 这里我们获取一大块请求 500 并异步执行它们 应该注意