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

时间:2014-03-05 23:10:03

标签: c# post upload task-parallel-library dotnet-httpclient

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

我在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中,如果有的话会打印异常。

对我来说非常奇怪的是我根本没有打印任何日志行。既不是为了进步,也不是为了成功发布,既没有发布错误,也没有发布在全局尝试中。

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

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


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

有助于我了解HttpClient不需要处理的额外信息可以找到here

1 个答案:

答案 0 :(得分:4)

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

如果您想在此使用HttpClient,则需要使用using代替await

ContinueWith

如果您需要定位.NET 4.0但使用VS2012 +进行开发,您仍然可以使用var result = await client.PostAsync(...); if (result.IsSuccessStatusCode) { // ... } ,Microsoft会为此提供Microsoft.Bcl.Async库。