Превышен предел размера буфера HttpClient - программирование
Подтвердить что ты не робот

Превышен предел размера буфера HttpClient

Я использую свой клиент, чтобы получить некоторую информацию об определенном файле, хранящемся в моем хранилище быстрых объектов, к которому можно получить доступ через REST Api. В Swift метод HEAD и url, ведущие к указанному объекту, возвращают метаданные (хеш, временная метка и т.д.), Содержащиеся в заголовках ответа HTML (не содержит содержания).

Мой код отлично работает, когда размер файла равен < 2 Гб. Я получаю HttpResponseMessage, и я могу проанализировать его для требуемых данных, но когда я запрашиваю файл > 2 ГБ, я получаю исключение: "Невозможно записать больше байтов в буфер, чем настроенный максимальный размер буфера: 2147483647".

Я понимаю, что свойство HttpClient MaxResponseContentBufferSize не может быть установлено в значение > 2 ГБ, но я не хочу получать его содержимое. Это какая-то ошибка или есть лучший способ решить эту проблему?

public HttpResponseMessage FileCheckResponse(string objectName)
   {
        //create url which will be appended to HttpClient (m_client)
        string requestUrl = RequestUrlBuilder(m_containerName, objectName);
        //create request message with Head method
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Head, requestUrl);
        //exception thrown here... 
        HttpResponseMessage response = m_client.SendAsync(request).Result;            

        return response;
    }

При попытке выполнить одно и то же действие с помощью Dev HTTP Client (расширение Chrome) у меня нет проблем. Кажется, что заголовок Content-Length делает его неосуществимым. Вот результат от Dev HTTP Client:

Content-Length: 3900762112
Accept-Ranges: bytes
Last-Modified: Fri, 06 Sep 2013 16:24:30 GMT
Etag: da4392bdb5c90edf31c14d008570fb95
X-Timestamp: 1378484670.87557
Content-Type: application/octet-stream
Date: Tue, 10 Sep 2013 13:25:27 GMT
Connection: keep-alive

Буду рад за любые идеи! Спасибо вам

Решение

Во-первых - спасибо Даррел Миррел, который решил всю мою проблему дня за несколько секунд:) Мне просто нужно было отредактировать одну строку в коде, добавив HttpCompletitionOption, где получен ответ:

HttpResponseMessage response = m_client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;

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

4b9b3361

Ответ 1

Используйте перегрузку SendAsync, которая позволяет вам указать HttpCompletionOptions. С этим вы можете указать HttpClient не создавать буфер для содержимого ответа.