Как получить `HttpStatusCode` без чтения контента с сервера? - PullRequest
0 голосов
/ 26 июня 2018

Я получаю огромные JSON данные с сервера
Проблема заключается в том, что процесс сериализации требует снижения производительности. Чтобы минимизировать эту стоимость, мне нужно сначала получить эти данные в виде потока, а затем с помощью Json.net библиотеки Newtonsoft сериализовать данные в виде потока до требуемого типа.
Сейчас я делаю это:

using (var stream = await httpClient.GetStreamAsync(requestUrl))
{
    using(var streamReader = new StreamReader(stream))
    {
        using(var jsonReader = new JsonTextReader(streamReader))
        {
            var items = jsonSerializer.Deserialize<TEntity[]>(jsonReader);
            //Some logic
        }
    }
}

Приведенный выше код хорош, но мне нужно получить HttpStatusCode от объекта ответа, но я не могу получить объект ответа при работе с потоками. Я искал решение и нашел этот вопрос.
Теперь мой вопрос: есть ли разница между этими двумя подходами?
Вызов GetAsync для получения объекта ответа, а затем вызов response.Content.ReadAsStreamAsync приведет ли это к снижению производительности?
Я имею в виду, как HttpClient делает это?
Загружает ли он данные в память, а затем, когда Я звоню response.Content.ReadAsStreamAsync Я читаю данные из памяти как поток?
Или, когда я звоню response.Content.ReadAsStreamAsync Я получаю данные в виде потока прямо с сервера?

1 Ответ

0 голосов
/ 26 июня 2018

HttpCompletionOption.ResponseHeadersRead ваш друг.

Операция должна завершиться, как только ответ станет доступен и заголовки прочитаны. Содержание еще не прочитано.

Вы можете использовать его в некоторых перегрузках методов HttpClient:

    using (HttpResponseMessage response = await client.GetAsync(url, 
                                     HttpCompletionOption.ResponseHeadersRead))
    using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
    {
        //...

HttpCompletionOption контролирует, будет ли ответ возвращен вызывающей стороне после его полной загрузки (ResponseContentRead) или сразу после получения заголовков (ResponseHeadersRead), что позволяет осуществлять потоковую передачу и сохранение ресурсов памяти .

...