2014-10-27 25 views
46

我一直在试图弄清楚如何读取httpclient调用的内容,而我似乎无法得到它。我得到的响应状态是200,但我无法弄清楚如何得到实际返回的Json,这就是我需要的!如何从httpclient调用获取内容正文?

以下是我的代码:

 async Task<string> GetResponseString(string text) 
    { 
     var httpClient = new HttpClient(); 

     var parameters = new Dictionary<string, string>(); 
     parameters["text"] = text; 
     Task<HttpResponseMessage> response = httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)); 

     return await response.Result.Content.ReadAsStringAsync(); 
    } 

而且我得到它只是从一个方法调用它:

Task<string> result = GetResponseString(text); 

,这就是我得到

response Id = 89, Status = RanToCompletion, Method = "{null}", Result = "StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:\r\n{\r\n Connection: keep-alive\r\n Date: Mon, 27 Oct 2014 21:56:43 GMT\r\n ETag: \"5a266b16b9dccea99d3e76bf8c1253e0\"\r\n Server: nginx/0.7.65\r\n Content-Length: 125\r\n Content-Type: application/json\r\n}" System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>

更新:这是每Nathan的回应我当前的代码下面

  async Task<string> GetResponseString(string text) 
    { 
     var httpClient = new HttpClient(); 

     var parameters = new Dictionary<string, string>(); 
     parameters["text"] = text; 

     var response = await httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)); 
     var contents = await response.Content.ReadAsStringAsync(); 

     return contents; 
    } 

而且我把它从这个方法....

string AnalyzeSingle(string text) 
    { 
     try 
     { 
      Task<string> result = GetResponseString(text); 
      var model = JsonConvert.DeserializeObject<SentimentJsonModel>(result.Result); 

      if (Convert.ToInt16(model.pos) == 1) 
      { 
       _numRetries = 0; 
       return "positive"; 
      } 

      if (Convert.ToInt16(model.neg) == 1) 
      { 
       _numRetries = 0; 
       return "negative"; 
      } 

      if (Convert.ToInt16(model.mid) == 1) 
      { 
       _numRetries = 0; 
       return "neutral"; 
      } 

      return ""; 

     } 
     catch (Exception e) 
     { 
      if (_numRetries > 3) 
      { 
       LogThis(string.Format("Exception caught [{0}] .... skipping", e.Message)); 
       _numRetries = 0; 
       return ""; 
      } 
      _numRetries++; 
      return AnalyzeSingle(text); 
     } 
    } 

它不断地运行下去,它击中线 var model = JsonConvert.DeserializeObject<SentimentJsonModel>(result.Result); 一次,并继续在另一个断点处不停地前进。

当我暂停执行,它说

编号=由于当前方法的代码被优化无法计算表达式。,状态=不能因为当前方法的代码被优化评估表达。,方法=由于当前方法的代码已经过优化,因此无法评估表达式。,结果=无法评估表达式,因为当前方法的代码已经过优化。

..我继续执行,但它只是永远运行。不知道是什么问题

+0

_numRetries在何处以及如何定义? – 2014-10-28 01:07:08

+0

它在类的范围内,并在构造函数中用0初始化。 AnalyzeSingle()是我使用它的唯一地方。 – 2014-10-28 03:12:10

+0

你在Debug模式下运行吗?优化问题可能是因为您在发布模式下运行。 – 2014-10-28 15:36:12

回答

80

您使用await/async的方式最多也不好,而且很难遵循。你在混合awaitTask'1.Result,这只是混淆。但是,看起来您正在查看最终任务结果,而不是内容。

我已经重写你的函数和函数调用,它应该解决您的问题:

async Task<string> GetResponseString(string text) 
{ 
    var httpClient = new HttpClient(); 

    var parameters = new Dictionary<string, string>(); 
    parameters["text"] = text; 

    var response = await httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)); 
    var contents = await response.Content.ReadAsStringAsync(); 

    return contents; 
} 

而且最终的函数调用:

Task<string> result = GetResponseString(text); 
var finalResult = result.Result; 

甚至更​​好:

var finalResult = await GetResponseString(text); 
+0

谢谢!我一直在试图了解过去几个小时(MSDN + stackoverflow)的async/await是如何工作的,但我显然还没有完全掌握它。有没有你会建议的资源? – 2014-10-27 22:43:15

+0

只要继续玩下去,最终你会得到它的萦绕。一次掌握所有的概念是一个很大的概念。 – 2014-10-27 22:49:25

+0

我仍然有问题。我在原帖中更新了我的问题。这个问题可能是我编码为同步执行,但我不知道如何解决这个问题 – 2014-10-27 23:43:13

32

如果您不想使用async,您可以添加.Result以强制要同步执行的代码:

private string GetResponseString(string text) 
    { 
     var httpClient = new HttpClient(); 

     var parameters = new Dictionary<string, string>(); 
     parameters["text"] = text; 

     var response = httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)).Result; 
     var contents = response.Content.ReadAsStringAsync().Result; 

     return contents; 
    } 
+0

如果从UI线程调用此代码,可能会导致死锁。 – 2017-08-10 11:04:48

+0

@nbushnell添加。结果PostAsync使它非异步 – Mike 2017-11-02 17:54:01

相关问题