You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Twilio API批量获取报告并在ASP.NET Core MVC实现完整分页

解决方案

你的问题出在仅通过单次if判断处理了第一页的下一页数据,没有实现循环遍历所有分页的逻辑。以下是优化后的完整代码,同时重构了重复的处理逻辑:

try
{
    var accountSid = _configuration.GetSection("TwilioAuth:ACCOUNT_SID").Value;
    var initialUrl = $"https://api.twilio.com/2010-04-01/Accounts/{accountSid}/Messages.json?DateSent={report.Date}&PageSize=1000";
    
    // 复用同一个HttpClient实例
    var client = _httpClientFactory.CreateClient("MyClient");
    ReportMessageModel model = null;
    var currentUrl = initialUrl;

    while (!string.IsNullOrEmpty(currentUrl))
    {
        var request = new HttpRequestMessage(HttpMethod.Get, currentUrl);
        HttpResponseMessage response = await client.SendAsync(request);
        
        if (!response.IsSuccessStatusCode)
        {
            // 可根据需求添加错误处理逻辑
            break;
        }

        var jsonResponse = await response.Content.ReadAsStringAsync();
        model = JsonConvert.DeserializeObject<ReportMessageModel>(jsonResponse);
        
        // 处理当前页的短信数据
        ProcessMessages(model.messages, outboundMessages, delivered, undelivered);

        // 更新下一页的请求地址
        currentUrl = model.next_page_uri != null ? $"https://api.twilio.com{model.next_page_uri}" : null;
    }

    // 最后统一设置ViewBag,避免频繁更新
    ViewBag.messageCount = outboundMessages;
    ViewBag.delivered = delivered.Count;
    ViewBag.undelivered = undelivered.Count;
}
catch (Exception ex)
{
    // 添加异常处理逻辑,比如日志记录
}

// 提取的消息处理方法,减少代码重复
private void ProcessMessages(List<Message> messages, List<string> outboundMessages, List<string> delivered, List<string> undelivered)
{
    foreach (var message in messages)
    {
        if (message.direction == "outbound-api")
        {
            outboundMessages.Add(message.status);
            
            if (message.status == "delivered")
            {
                delivered.Add(message.status);
            }
            else if (message.status == "undelivered")
            {
                undelivered.Add(message.status);
            }
        }
    }
}

关键改动说明

  • 循环遍历分页:用while循环替代单次if判断,只要currentUrl不为空就持续请求下一页,直到所有数据获取完成
  • 代码复用:将重复的消息处理逻辑提取到ProcessMessages方法中,避免冗余代码,提升可维护性
  • HttpClient复用:只创建一次HttpClient实例,符合HttpClientFactory的最佳实践,避免频繁创建连接
  • 统一ViewBag赋值:在所有数据处理完成后再设置ViewBag,而非每次循环都更新,减少不必要的操作
  • 错误处理优化:增加了响应状态码判断,可根据需求补充异常捕获和日志记录逻辑

内容的提问来源于stack exchange,提问作者Earlingh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 05:42:33