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

网络中断时文件上传的检查与重试机制实现咨询

文件上传网络中断后的重试与网络监测实现

针对你提出的上传文件时网络中断后的处理需求,以下是完整的实现方案,包含CheckInternetTillTimeout方法的具体实现以及重试逻辑的完善:

核心实现步骤

  • 过滤异常类型:仅针对网络相关异常触发重试逻辑,避免无意义的重试(比如文件不存在、权限错误等)
  • 实现定时网络监测:在指定超时周期内周期性检测网络状态
  • 网络恢复后重试上传:确认网络恢复后重新发起上传请求
  • 超时失败处理:超时后记录失败日志

1. 网络状态监测方法实现

/// <summary>
/// 在指定超时时间内持续监测网络状态,恢复则返回true,超时未恢复返回false
/// </summary>
/// <param name="timeoutMs">超时时间(毫秒)</param>
/// <param name="checkIntervalMs">检测间隔(毫秒)</param>
/// <returns></returns>
private async Task<bool> CheckInternetTillTimeout(int timeoutMs, int checkIntervalMs = 500)
{
    var endTime = DateTime.Now.AddMilliseconds(timeoutMs);
    // 建议替换为上传目标服务的地址,提升检测准确性
    var pingHost = "www.baidu.com";
    var ping = new Ping();

    while (DateTime.Now < endTime)
    {
        try
        {
            // 发送Ping请求,超时时间设为1秒
            var reply = await ping.SendPingAsync(pingHost, 1000);
            if (reply.Status == IPStatus.Success)
            {
                return true;
            }
        }
        catch
        {
            // Ping失败,继续下一次检测
        }
        // 等待指定间隔后再次检测
        await Task.Delay(checkIntervalMs);
    }
    return false;
}

2. 完善上传重试逻辑

public async Task UploadWithRetry(string filePath, int id, int retryTimeoutMs = 5000)
{
    try
    {
        var uploadResponse = await service.UploadFile(filePath, id);
        // 上传成功后的后续处理逻辑
    }
    catch (Exception e)
    {
        // 仅针对网络相关异常触发重试
        if (e is HttpRequestException || e is WebException || e.InnerException is HttpRequestException)
        {
            bool isNetworkRecovered = await CheckInternetTillTimeout(retryTimeoutMs);
            if (isNetworkRecovered)
            {
                // 网络恢复,重试上传
                await UploadWithRetry(filePath, id, retryTimeoutMs);
            }
            else
            {
                // 超时未恢复,记录失败日志
                Console.WriteLine($"文件上传失败:网络超时未恢复,文件路径:{filePath},错误信息:{e.Message}");
                // 实际项目中可替换为Serilog、NLog等专业日志框架
            }
        }
        else
        {
            // 非网络异常,直接记录失败日志
            Console.WriteLine($"文件上传失败:非网络错误,文件路径:{filePath},错误信息:{e.Message}");
        }
    }
}

注意事项

  • 检测准确性优化:把pingHost换成你要上传的目标服务地址,能直接判断目标服务是否可达,比检测通用网络更精准
  • 资源消耗控制:checkIntervalMs建议设为500-1000毫秒,避免过于频繁的检测浪费资源
  • 重试次数限制:如果需要限制重试次数,可以给方法添加重试次数参数,防止无限递归
  • 异常类型扩展:根据你使用的上传服务抛出的异常类型,补充更多网络相关异常的判断,确保覆盖所有网络中断场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:45:43