如何通过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
相关产品推荐
相关产品推荐

