【问题标题】:Get content result from HttpRequestMessage?从 HttpRequestMessage 获取内容结果?
【发布时间】:2016-05-25 17:53:23
【问题描述】:

我有以下代码:

var client = new HttpClient()
{
    BaseAddress = new Uri(@"https://myhost:myport/"),
};
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

var uri = @"myurl";

var s = JsonConvert.SerializeObject(myobject);
string responseResult = string.Empty;

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Put, uri);
request.Content = new StringContent(s, Encoding.UTF8, "application/json");

client.SendAsync(request)
      .ContinueWith(responseTask =>
      {
           responseResult = responseTask.Result.Content.ReadAsStringAsync().Result;
      });

txtLog.Text = responseResult;

上面的请求应该返回一个字符串结果,但是结果是空的。我会失踪吗?

【问题讨论】:

  • ContinueWith 确保它包含的方法将在 AsyncCall 之后执行,但它仍然是异步的。这意味着您对“txtLog.Text”的分配可能发生在“ContinueWith”执行之前。

标签: c# httpclient


【解决方案1】:

在延续运行后才能使用结果,因此将分配到 Text 属性的分配移到延续中:

    client.SendAsync(request)
        .ContinueWith(responseTask =>
        {
            responseResult = responseTask.Result.Content.ReadAsStringAsync().Result;
            txtLog.Text = responseResult;
        });

另一个复杂的问题是Text 属性只想在 UI 线程上设置:

    client.SendAsync(request)
        .ContinueWith(responseTask =>
        {
            responseResult = responseTask.Result.Content.ReadAsStringAsync().Result;
            Dispatcher.Invoke(() => txtLog.Text = responseResult);
        });

编辑

Await/async 通常更容易使用;你可以用这个替换上面的:

var message = await client.SendAsync(request);
responseResult = await message.Content.ReadAsStringAsync();
txtLog.Text = responseResult;

【讨论】:

    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多