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
        }
    }
}
Другие вопросы по тегам