Подтвердить что ты не робот

Как получить содержимое тела от вызова httpclient?

Я пытался понять, как читать содержимое вызова httpclient, и я не могу его получить. Статус ответа - 200, но я не могу понять, как добраться до возвращаемого фактического Json, и это все, что мне нужно!

Вот мой код:

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>

Обновление: Это мой текущий код в ответе Натана ниже

    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); Один раз, и он продолжает идти без остановки на другой точке останова.

Когда я приостанавливаю исполнение, говорят

Id = Невозможно оценить выражение, потому что код текущего метода оптимизирован., Status = Невозможно оценить выражение, потому что код текущего метода оптимизирован., Method = Невозможно оценить выражение, потому что код текущего метода оптимизирован., Result = Невозможно оценить выражение, так как код текущего метода оптимизирован.

.. Продолжаю казнь, но она работает вечно. Не уверен в чем проблема

4b9b3361

Ответ 1

То, как вы используете await/async, в лучшем случае беден, и это затрудняет выполнение. Вы смешиваете await с Task'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);

Ответ 2

Если вы не хотите использовать 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;
 }