【问题标题】:Make http client synchronous: wait for response使http客户端同步:等待响应
【发布时间】:2015-09-16 18:06:00
【问题描述】:

我有一些文件要上传,但有些文件失败了,因为帖子是异步的而不是同步的..

我正在尝试将此调用作为同步调用..

我想等待回复。

我怎样才能使这个调用同步?

static async Task<JObect> Upload(string key, string url, string 
                                 sourceFile, string targetFormat)
{ 
    using (HttpClientHandler handler = new HttpClientHandler { 
                                           Credentials = new NetworkCredential(key, "") 
                                       })
    using (HttpClient client = new HttpClient(handler))
    {
         var request = new MultipartFormDataContent();
         request.Add(new StringContent(targetFormat), "target_format");
         request.Add(new StreamContent(File.OpenRead(sourceFile)),
                                       "source_file",
                                        new FileInfo(sourceFile).Name);

        using (HttpResponseMessage response = await client.PostAsync(url,
                                                           request).ConfigureAwait(false))

        using (HttpContent content = response.Content)
        {
            string data = await content.ReadAsStringAsync().ConfigureAwait(false);
            return JsonObject.Parse(data);
        }
    }
}

任何帮助表示赞赏!

【问题讨论】:

  • 您能否发布有关失败的更多详细信息?异步执行不应导致上传失败。如果你真的必须,你可以使用 Task.Wait 并检查返回值以查看任务是否完成。 msdn.microsoft.com/en-us/library/dd235606(v=vs.110).aspx
  • 我认为您不应该使用 ConfigureAwait。请在不使用 ConfigureAwait 的情况下进行检查。
  • @rikkigibson 在来自线程池的原始线程上的await 之后继续(没有正确配置 HttpContext/Culture 或 UI 线程)通常会在方法的调用者中处理 NRE(调用代码、错误和框架都没有)由 OP 显示,很难查明问题)。正如 Amit 指出的那样,ConfigureAwait 通常是让代码工作不正常的方法(希望能解决其他一些同步问题)。 IE。这是关于 ASP.Net 使用它的讨论 - stackoverflow.com/questions/13489065/…
  • 没有configureAwait=false,上传没有完成。所以看了这篇博文,加了:blog.stephencleary.com/2012/07/dont-block-on-async-code.html
  • @AlonShmiel:需要明确的是,上传失败并不是因为它是异步的,而是因为上游的代码阻塞了它。 ConfigureAwait(false) 只是一个 hacky 解决方法;正确的解决方法是将调用代码更改为异步而不是阻塞。

标签: c# httpresponse dotnet-httpclient


【解决方案1】:

应该这样做:

static async Task<JObect> Upload(string key, string url, string 
                             sourceFile, string targetFormat)
{ 
    using (HttpClientHandler handler = new HttpClientHandler { 
                                           Credentials = new NetworkCredential(key, "") 
                                   })
    using (HttpClient client = new HttpClient(handler))
    {
         var request = new MultipartFormDataContent();
         request.Add(new StringContent(targetFormat), "target_format");
         request.Add(new StreamContent(File.OpenRead(sourceFile)),
                                   "source_file",
                                    new FileInfo(sourceFile).Name);

        using (HttpResponseMessage response = await client.PostAsync(url,request))

        using (HttpContent content = response.Content)
        {
            string data = await content.ReadAsStringAsync();
            return JsonObject.Parse(data);
        }
    }
}

【讨论】:

【解决方案2】:

改变

await content.ReadAsStringAsync().ConfigureAwait(false)

content.ReadAsStringAsync().Result

ReadAsStringAsync 返回一个 Task 对象。行尾的 '.Result' 告诉编译器返回内部字符串。

【讨论】:

  • 我正要放弃才找到这个答案
猜你喜欢
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多