使用WebClient的UploadFileAsync方法为何无错误通知?
为什么调用WebClient.UploadFileAsync时没有错误通知?
这事儿我熟,WebClient的UploadFileAsync用的是事件驱动的异步模式(EAP),它的错误不会直接抛出给调用方,而是藏在回调事件的参数里,如果你没特意去检查,自然就看不到错误通知啦。
咱们结合你的代码来拆解问题:
核心问题:你没在回调里处理异常
你注册了UploadFileCompleted事件的回调UploadCompletedCallback,但如果这个回调里没检查UploadFileCompletedEventArgs的Error属性,就算上传出错了,程序也不会给你任何提示。
修复方法1:完善回调方法的异常检查
把你的回调改成这样,就能捕获并处理上传时的错误了:
private static void UploadCompletedCallback(object sender, UploadFileCompletedEventArgs e) { // 先检查是否有异常 if (e.Error != null) { Console.WriteLine($"上传失败:{e.Error.Message}"); // 这里可以根据需求做更详细的异常处理,比如记录日志、通知用户等 return; } // 再检查是否被取消 if (e.Cancelled) { Console.WriteLine("上传操作被取消"); return; } // 没有异常也没被取消,就是上传成功了 Console.WriteLine("文件上传完成!"); }
更推荐的做法:改用async/await模式的UploadFileTaskAsync
如果你习惯现代异步编程的async/await写法,完全可以弃用UploadFileAsync,改用UploadFileTaskAsync,这样就能用熟悉的try/catch直接捕获异常,代码可读性也更高:
public static async Task UploadFile(string serverPath, string pathToFile, string authToken) { serverPath = @"C:\_Series\S1\The 100 S01E03.mp4"; // using语句自动释放WebClient资源,避免泄漏 using var client = new WebClient(); var uri = new Uri($"http://localhost:50424/api/File/Upload?serverPath={WebUtility.UrlEncode(serverPath)}"); client.UploadProgressChanged += UploadProgressChanged; try { await client.UploadFileTaskAsync(uri, "POST", pathToFile); Console.WriteLine("文件上传完成!"); } catch (WebException ex) { // 处理网络相关的异常,比如请求失败、服务器错误等 Console.WriteLine($"上传出错:{ex.Message}"); // 还能通过ex.Response获取服务器返回的错误详情 } catch (Exception ex) { // 处理其他未知异常 Console.WriteLine($"发生意外错误:{ex.Message}"); } }
额外提醒
- 不管用哪种方式,记得给
WebClient做资源释放(比如用using语句),避免内存泄漏。 - 如果用
UploadFileAsync,还要注意如果程序提前退出,上传可能会被取消,这时候e.Cancelled会是true,记得在回调里也处理这种情况。
内容的提问来源于stack exchange,提问作者ProfK
相关产品推荐
相关产品推荐

