WebClient异步上传文件后获取响应头返回null如何解决
问题根因
你调用的UploadFileAsync是异步非阻塞方法,代码执行到读取wc.ResponseHeaders时,上传请求还未完成、服务端响应尚未返回,因此该属性返回值为null。
解决方案
方案1:使用同步上传方法
如果不需要异步进度监控,可直接替换为同步上传方法,方法执行完成后响应头已完成赋值:
public void UploadPart(string filePath, string preSignedUrl) { WebClient wc = new(); // 同步上传会阻塞到上传完成 wc.UploadFile(new Uri(preSignedUrl), "PUT", filePath); WebHeaderCollection myWebHeaderCollection = wc.ResponseHeaders; System.Diagnostics.Debug.WriteLine(myWebHeaderCollection); }
方案2:在异步完成事件中读取响应头
如果需要保留异步进度监听能力,将读取响应头的逻辑移到UploadFileCompleted事件回调中即可:
public void UploadPart(string filePath, string preSignedUrl) { WebClient wc = new(); wc.UploadProgressChanged += WebClientUploadProgressChanged; wc.UploadFileCompleted += (sender, e) => { // 回调触发时上传已完成,可正常读取响应头 WebHeaderCollection myWebHeaderCollection = wc.ResponseHeaders; System.Diagnostics.Debug.WriteLine(myWebHeaderCollection); // 原有WebClientUploadCompleted逻辑保留 WebClientUploadCompleted(sender, e); }; wc.UploadFileAsync(new Uri(preSignedUrl), "PUT", filePath); }
补充说明
WebClient是.NET Framework时代的遗留API,在.NET Core 2.1及更高版本中,更推荐使用HttpClient实现上传逻辑,功能更灵活性能也更优。
内容的提问来源于stack exchange,提问作者JMR
相关产品推荐
相关产品推荐

