网络中断时文件上传的检查与重试机制实现咨询
文件上传网络中断后的重试与网络监测实现
针对你提出的上传文件时网络中断后的处理需求,以下是完整的实现方案,包含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
相关产品推荐
相关产品推荐

