HttpClient 通过 PostAsync 上传文件的奇怪行为

Posted

技术标签:

【中文标题】HttpClient 通过 PostAsync 上传文件的奇怪行为【英文标题】:Weird behavior of HttpClient uploading file via PostAsync 【发布时间】:2014-03-05 23:10:03 【问题描述】:

我希望有人对此做出解释,因为它让我发疯。

我在 WinForms 应用程序中有以下代码,用于使用 HttpClient 将文件上传到 Web API 服务。

ProgressMessageHandler progressMsgHandler = new ProgressMessageHandler();
progressMsgHandler.HttpSendProgress += (s, e) =>

   this.InvokeIfNeeded(() =>
   
      // LOG
      this.AddLogLine("Progress: " + e.ProgressPercentage.ToString());
    );
;

using (var client = HttpClientFactory.Create(progressMsgHandler))
 
   using (var content = new MultipartFormDataContent())
   
      var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
      var streamContent = new StreamContent(stream);
      content.Add(streamContent);

      var url = String.Format("0?src=1", STR_URL_FILEMGMT, "IM");
      client.PostAsync(new Uri(url), content).ContinueWith(task =>
      
        if (task.Result.IsSuccessStatusCode)
         
            this.InvokeIfNeeded(() =>
            
               // LOG
               this.AddLogLine("File has been uploaded OK!");
            );
         
         else
            this.InvokeIfNeeded(() =>
            
               // LOG
               this.AddLogLine(String.Format("Error during upload: '0'", task.Exception.Message));
            );                                
      );
   

请注意,列出的整个代码也被包装在一个 try catch 中,如果有异常,将在其中打印。

对我来说很奇怪的是我根本没有打印任何日志行。既不是进步,也不是成功发布,既不是错误发布,也不是全局try catch。

在调试期间,我看到代码正在执行,但没有遇到日志行所在的任何断点。

可能我没有正确使用 HttpClient 或这些任务(顺便说一句,我是初学者)?有谁知道我的代码出了什么问题?


更新(从 Noseratio 获得解决方案后):

可以在here找到帮助我理解不需要处理 HttpClient 的额外信息

【问题讨论】:

【参考方案1】:

在您的代码中,client.PostAsync 立即返回(而操作在后台继续)。这会展开您的两个 using 语句,因此 HttpClient 对象在上传完成之前被处理掉。

如果你想在这里使用using,你需要使用await而不是ContinueWith

var result = await client.PostAsync(...);
if (result.IsSuccessStatusCode)

    // ...

如果您需要面向 .NET 4.0 但使用 VS2012+ 进行开发,您仍然可以使用async/await,微软为此提供了Microsoft.Bcl.Async 库。

【讨论】:

这很有价值。顺便说一句,我正在使用 VS2010,所以我现在想避免 async/await。你能给我一些提示吗?非常感谢! 确实,这个链接也是这么说的:forums.asp.net/t/1775726.aspx ...我想我现在必须找到一种方法来妥善处理它 @Cristi,如果没有await,您将无法从using 中受益,但您可以使用一些方便的构图模式:blogs.msdn.com/b/pfxteam/archive/2010/11/21/10094564.aspx 非常有用,谢谢。现在我删除了 using 子句,奇怪的是我得到了相同的行为。也许是因为第二次使用。我必须做更多的测试.. 非常感谢您的支持,非常感谢!

以上是关于HttpClient 通过 PostAsync 上传文件的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

使用 HttpClient PostAsync 发送 C# NameValueCollection 问题

使用 httpClient.postasync 进行 web api 调用 .net core

带有标题和内容c#的HttpClient PostAsync [重复]

HttpClient.PostAsync 崩溃应用。如何捕捉异常?

异步等待 HttpClient.PostAsync 调用

查看 HttpClient.PostAsync 的响应正文