C# 如何从httpclient调用获取内容正文?
我一直在试图弄清楚如何读取httpclient调用的内容,但似乎弄不懂。我得到的响应状态是200,但我不知道如何获得返回的实际Json,这就是我所需要的 以下是我的代码: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
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;
}