Próbowałem wymyślić, jak odczytać zawartość wywołania httpclient, ale nie mogę tego uzyskać. Status odpowiedzi, który otrzymuję, to 200, ale nie mogę dowiedzieć się, jak dostać się do rzeczywistego zwracanego pliku Json, czyli wszystkiego, czego potrzebuję!
Oto mój kod:
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();
}
Otrzymuję to po prostu wywołując to z metody:
Task<string> result = GetResponseString(text);
I to właśnie dostaję
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>
Aktualizacja: To jest mój aktualny kod na odpowiedź Nathana poniżej
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;
}
I nazywam to tą metodą ....
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);
}
}
I działa wiecznie, var model = JsonConvert.DeserializeObject<SentimentJsonModel>(result.Result);
Raz trafia w linię
i dalej jedzie bez zatrzymywania się na innym punkcie przerwania.
Kiedy wstrzymuję wykonanie, mówi
Id = Nie można ocenić wyrażenia, ponieważ kod bieżącej metody jest zoptymalizowany., Status = Nie można ocenić wyrażenia, ponieważ kod bieżącej metody jest zoptymalizowany., Metoda = Nie można ocenić wyrażenia, ponieważ kod bieżącej metody jest zoptymalizowany., Wynik = Nie można ocenić wyrażenia, ponieważ kod bieżącej metody jest zoptymalizowany.
.. Kontynuuj wykonywanie, ale to po prostu trwa wiecznie. Nie jestem pewna na czym polega problem
źródło
Odpowiedzi:
Sposób, w jaki używasz await / async, jest w najlepszym razie słaby i utrudnia śledzenie. Mieszasz się
await
zTask'1.Result
, co jest po prostu mylące. Wygląda jednak na to, że patrzysz na końcowy wynik zadania, a nie na zawartość.Przepisałem twoją funkcję i wywołanie funkcji, co powinno rozwiązać twój problem:
I ostatnie wywołanie funkcji:
Albo jeszcze lepiej:
źródło
IDisposable
, nie powinieneś zawijać go wusing
oświadczeniu. To rzadki wyjątek od reguły. Zobacz ten post, aby uzyskać więcej informacji: aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongJeśli nie chcesz używać
async
, możesz dodać,.Result
aby wymusić synchroniczne wykonywanie kodu:źródło
response
? Mam podobny kod, ale muszę uczynić goresponse
globalnym, więc potrzebuję typu. Dzięki.