HttpClient GetStreamAsync и HTTP коды состояния?
Я хочу использовать потоки, как рекомендовано в документации по советам по производительности json.net, однако я не могу найти, как получить коды состояния http без типичного ожидания HttpResponse.
Возможно ли сначала получить код состояния, не читая данные? Так все еще пользуетесь потоками?
2 ответа
Я не проверял, чтобы убедиться в его производительности, однако это выглядит многообещающе:
using(HttpClient client = new HttpClient())
{
var response = await client.GetAsync("http://httpbin.org/get", HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
using (var stream = await response.Content.ReadAsStreamAsync())
using (var streamReader = new StreamReader(stream))
using (var jsonReader = new JsonTextReader(streamReader))
{
var serializer = new JsonSerializer();
//do some deserializing http://www.newtonsoft.com/json/help/html/Performance.htm
}
}
Я предпочитаю распоряжаться HttpResponseMessage через using
как это одноразово. Я также предпочитаю не полагаться на обработку исключений для обработки неудачных запросов. Вместо этого я предпочитаю сверять IsSuccessStatusCode
логическое значение и действовать соответственно. Например:
using(HttpClient client = new HttpClient())
{
using(var response = await client.GetAsync("http://httpbin.org/get", HttpCompletionOption.ResponseHeadersRead))
{
if(response.IsSuccessStatusCode)
{
using (var stream = await response.Content.ReadAsStreamAsync())
using (var streamReader = new StreamReader(stream))
using (var jsonReader = new JsonTextReader(streamReader))
{
var serializer = new JsonSerializer();
//do some deserializing http://www.newtonsoft.com/json/help/html/Performance.htm
}
}
else {
//do your error logging and/or retry logic
}
}
}
РЕДАКТИРОВАТЬ: Если вы работаете с API-интерфейсом с ограниченной скоростью, отправка запроса HEAD просто нереально. Таким образом, вот пример кода с использованием старой доброй моды
HttpWebRequest
(обратите внимание, что нет лучшего способа справиться с ошибками http, чемWebException
в этом случае):
var req = WebRequest.CreateHttp("http://httpbin.org/get");
/*
* execute
*/
try
{
using (var resp = await req.GetResponseAsync())
{
using (var s = resp.GetResponseStream())
using (var sr = new StreamReader(s))
using (var j = new JsonTextReader(sr))
{
var serializer = new JsonSerializer();
//do some deserializing http://www.newtonsoft.com/json/help/html/Performance.htm
}
}
}
catch (WebException ex)
{
using (HttpWebResponse response = (HttpWebResponse)ex.Response)
{
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
string respStr = sr.ReadToEnd();
int statusCode = (int)response.StatusCode;
//do your status code logic here
}
}
}