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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:33:58