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

.NET Framework 4.5控制台程序HTTP请求后循环跳过迭代问题

问题排查与解决建议

1. 异步Main方法的.NET Framework 4.5兼容性问题

.NET Framework 4.5不支持async Task Main,该特性直到.NET Framework 4.7.2才正式引入。如果你的项目基于.NET Framework 4.5,这种写法会导致运行时无法正确等待所有异步操作完成,程序可能在执行到300次请求时就提前终止,表现为“跳过迭代”。

解决方法:
将Main方法改为同步写法,手动等待异步任务完成:

static void Main(string[] args)
{
    MainAsync(args).Wait();
}

static async Task MainAsync(string[] args)
{
    // 原Main方法的所有逻辑迁移到此处
}

2. 验证数据源集合的完整性

先确认fornitori集合的实际元素数量,避免因数据源本身不完整导致迭代次数不足:

var fornitori = await fornitoriRepository.GetFornitoriAsync(lastRun);
var fornitoriCount = fornitori is ICollection ? ((ICollection)fornitori).Count : fornitori.Count();
Console.WriteLine($"获取到的Fornitori总数:{fornitoriCount}");

如果输出数量为300,问题出在GetFornitoriAsync的逻辑(比如lastRun时间过滤错误、数据库查询分页限制等),需排查数据获取环节。

3. 目标API的速率限制或请求阻塞

目标API可能存在请求频率限制,当达到阈值后会静默丢弃请求、延迟响应或断开连接,导致SendAsync调用长时间阻塞,结合Main方法的异步兼容性问题,最终程序提前终止。

排查与优化步骤:

  • 在PostFornitoreAsync中添加高精度时间日志,确认请求是否卡在发送/响应环节:
    private static async Task<string> PostFornitoreAsync(FornitoreDTO fornitore)
    {
        Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] 开始处理请求,ERP Code: {fornitore.erpcode}");
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, ConfigurationManager.AppSettings["ResourceUri"]);
        // 原请求构建逻辑
        Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] 发送请求,等待响应");
        HttpResponseMessage response = await httpClient.SendAsync(request);
        Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] 收到响应,状态码: {response.StatusCode}");
        // 原响应处理逻辑
    }
    
  • 若确认是API速率限制,添加请求间隔:
    // 每次请求完成后添加短暂延迟,根据API要求调整时长
    await Task.Delay(100);
    

4. 补充异常捕获与取消令牌

虽然你有全局try-catch,但部分异步异常(如操作取消异常)可能未被捕获,或请求因无取消机制长时间阻塞。

优化建议:

  • 为SendAsync添加取消令牌,避免无限等待:
    using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(60));
    HttpResponseMessage response = await httpClient.SendAsync(request, cts.Token);
    
  • 增强异常捕获的详细度,包含内部异常信息:
    catch(Exception ex)
    {
        var errorDetail = new StringBuilder();
        errorDetail.AppendLine($"错误消息:{ex.Message}");
        errorDetail.AppendLine($"调用栈:{ex.StackTrace}");
        if(ex.InnerException != null)
            errorDetail.AppendLine($"内部错误:{ex.InnerException.Message}");
        Log.InvioLog("Errore Demoni - FornitoriPLM", errorDetail.ToString());
        Console.WriteLine($"ECCEZIONE: {errorDetail}");
    }
    

内容的提问来源于stack exchange,提问作者Simone D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:51:00