C# 如何从httpclient调用获取内容正文?

C# 如何从httpclient调用获取内容正文?,c#,dotnet-httpclient,C#,Dotnet Httpclient,我一直在试图弄清楚如何读取httpclient调用的内容,但似乎弄不懂。我得到的响应状态是200,但我不知道如何获得返回的实际Json,这就是我所需要的 以下是我的代码: async Task<string> GetResponseString(string text) { var httpClient = new HttpClient(); var parameters = new Dictionary<string, string>(); p

我一直在试图弄清楚如何读取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();
}
异步任务GetResponseString(字符串文本) { var httpClient=新的httpClient(); var参数=新字典(); 参数[“文本”]=文本; 任务响应= PostAsync(BaseUri,新FormUrlEncodedContent(参数)); 返回wait response.Result.Content.ReadAsStringAsync(); } 我只是从一个方法调用它:

Task<string> result =  GetResponseString(text);
Task result=GetResponseString(文本);
这就是我得到的

response Id=89,Status=RanToCompletion,Method=“{null}”,Result=“StatusCode:200,ReasonPhrase:'OK',版本:1.1,内容:System.Net.Http.StreamContent,标题:\r\n{\r\n连接:保持活动\r\n日期:2014年10月27日星期一21:56:43 GMT\r\n ETag:\”5a266b16b9dccea99d3e76bf8c1253e0\“\r\n服务器:nginx/0.7.65\r\n内容长度:125\r\n内容类型:application/json\r\n}”System.Threading.Tasks.Task

更新:根据下面内森的回复,这是我当前的代码

    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;
    }
异步任务GetResponseString(字符串文本) { var httpClient=新的httpClient(); var参数=新字典(); 参数[“文本”]=文本; var response=wait httpClient.PostAsync(BaseUri,新FormUrlEncodedContent(参数)); var contents=wait response.Content.ReadAsStringAsync(); 返回内容; } 我从这个方法中调用它

 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);
        }
    }
string AnalyzeSingle(字符串文本)
{
尝试
{
任务结果=GetResponseString(文本);
var model=JsonConvert.DeserializeObject(result.result);
if(转换为16(型号pos)==1)
{
_numRetries=0;
返回“正”;
}
if(转换为16(负型)==1)
{
_numRetries=0;
返回“否定”;
}
if(转换为16(model.mid)==1)
{
_numRetries=0;
返回“中立”;
}
返回“”;
}
捕获(例外e)
{
如果(_numRetries>3)
{
LogThis(string.Format(“捕获到异常[{0}]..跳过”,e.Message));
_numRetries=0;
返回“”;
}
_numRetries++;
返回分析单(文本);
}
}
它永远在运行,它击中了底线
var model=JsonConvert.DeserializeObject(result.result);
一次,它将继续运行,而不会在另一个断点处停止

当我暂停执行时,它会说

Id=无法计算表达式,因为当前方法的代码已优化。状态=无法计算表达式,因为当前方法的代码已优化。方法=无法计算表达式,因为当前方法的代码已优化。结果=无法计算表达式,因为当前方法的代码为op胆小的


…我继续执行,但它只是永远运行。不确定问题出在哪里。

您使用wait/async的方式最好是不好的,并且很难遵循。您将
wait
Task'1.Result
混合在一起,这让人困惑。不过,看起来您正在查看的是最终任务结果,而不是cont恩茨

我已经重写了您的函数和函数调用,这将解决您的问题:

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;
}

如果不想使用
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;
 }  
私有字符串GetResponseString(字符串文本)
{
var httpClient=新的httpClient();
var参数=新字典();
参数[“文本”]=文本;
var response=httpClient.PostAsync(BaseUri,新FormUrlEncodedContent(参数)).Result;
var contents=response.Content.ReadAsStringAsync().Result;
返回内容;
}  

谢谢!!在过去的几个小时里,我一直在尝试了解async/await的工作原理(MSDN+stackoverflow),但我显然还没有完全掌握它。你有什么建议吗?继续玩下去,你最终会掌握它的窍门的。这是一个需要一次掌握的大概念。我仍然有一些问题。我在最初的帖子上更新了我的问题。问题可能是我正在为同步执行编写代码,但我没有确定如何解决该问题HttpClient实现IDisposable,因此最好将其包装在using语句中。@Payam虽然它确实实现了
IDisposable
,但不应将其包装在
using
语句中。这是该规则的一个罕见例外。有关详细信息,请参阅本文:在何处以及如何定义_numRetries?请参阅s位于类的作用域中,并在构造函数中用0初始化。AnalyzeSSingle()是我唯一使用它的地方。您是否在调试模式下运行?优化问题可能是因为您在发布模式下运行。我当前正在调试/iisExpress@nbushnell将.Result添加到PostAsync将使其成为非同步-async@Mike这不是nbushnell说的吗?:-)响应的类型是什么?我有一个类似的代码,但我不知道需要使
response
global,所以我需要类型。谢谢。@AzureSpot:De类型的响应是HttpResponseMessage。
var finalResult = await GetResponseString(text);
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;
 }