【问题标题】:Using HttpClient async methods returns string wrongly formated使用 HttpClient 异步方法返回格式错误的字符串
【发布时间】:2014-04-07 11:55:34
【问题描述】:

我不确定这个错误是否仅在使用 ReadAsStringAsync() 时发生,但我很确定我在使用非异步时没有这个问题。

问题是返回的字符串应该是“10”而不是“//”\“10\””(JSON格式)

我该如何解决这个问题? 服务器端代码来自 RESTful WebAPI,客户端代码来自与 WebAPI 通信的客户端。

编辑#1: 你们可能误解了我的意思。 我知道我通过使用 .Result() 扩展名得到了我想要的字符串。 但我的问题是如何通过使用可等待函数(不带 .Result())获得相同的结果?

编辑#2: 请评论否决票。我不明白我的问题有什么问题?如果这是一个愚蠢的问题,那么请告诉我我不明白的地方

【问题讨论】:

  • 将您的代码显示为文本,而不是图像。
  • 我可以将代码作为文本发布.. 但我使用屏幕截图向您展示了结果
  • @darkdog 你要求什么content-type,你收到了什么?请发布创建客户端请求的代码。服务器显然会发回正文中的原始"10",可能格式为 JSON。
  • 内容类型是应用程序/json @PanagiotisKanavos
  • 请评论否决

标签: c# .net json asp.net-web-api async-await


【解决方案1】:

这里没有问题。服务器将字符串值“10”作为响应的raw HTTP 正文返回给客户端,内容类型为application/json。您在returnValue 中看到的值是反序列化之前的原始值。

反序列化 HTTP 正文后,您将获得原始字符串。

以下控制台应用程序 sn-p 返回 `"\"10\""' 作为原始值,但 "10" 作为反序列化值:

var client = new HttpClient();
var s = client.GetStringAsync(@"http://localhost:7807/api/values/10").Result;
Debug.Assert(s=="\"10\"");

var s2=(string)JsonConvert.DeserializeObject(s);
Debug.Assert(s2 == "10");

您也可以使用async\await,例如:

static async Task<string> GetDataAsync()
{
    var client = new HttpClient();
    var s = await client.GetStringAsync(@"http://localhost:7807/api/values/10");
    var s2 = (string)JsonConvert.DeserializeObject(s);
    return s2;
}

【讨论】:

  • 是的,你是对的。但是我怎样才能让它等待..如果我使用 .Result 返回类型不再是 Task 类型..
  • 使用await client.GetStringAsync 代替....Result。我使用 .Result 是因为我创建了一个控制台客户端。
  • 哦,我明白了。所以我必须自己反序列化它。这是一个完美的答案:) 非常感谢 Panagiotis。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 2016-02-27
  • 2021-07-23
  • 1970-01-01
相关资源
最近更新 更多