Przekroczono limit wielkości bufora HttpClient
Korzystam z mojego klienta, aby uzyskać pewne informacje o pewnym pliku przechowywanym w mojej pamięci masowej Swift Object, do której można uzyskać dostęp poprzez REST Api. W Swift metoda HEAD i adres URL prowadzący do określonego obiektu zwracają metadane (skrót, znacznik czasu itp.) Zawarte w nagłówkach odpowiedzi HTML (NIE MA ZAWARTOŚCI).
Mój kod działa doskonale, gdy rozmiar pliku wynosi <2 GB. Dostaję HttpResponseMessage i jestem w stanie go przeanalizować pod kątem wymaganych danych, ale kiedy pytam o plik> 2 GB, otrzymuję wyjątek: „Nie można zapisać więcej bajtów w buforze niż skonfigurowany maksymalny rozmiar bufora: 2147483647”.
Rozumiem, że właściwości HttpClient MaxResponseContentBufferSize nie można ustawić na wartość> 2 GB, ale nie chcę otrzymywać jej zawartości. Czy to jakiś błąd, czy jest jakiś lepszy sposób na rozwiązanie tego problemu?
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;
}
Podczas próby wykonania tej samej akcji za pomocą klienta Dev HTTP (rozszerzenie Chrome) nie mam problemu. Wydaje się, że nagłówek Content-Length czyni to niewykonalnym. Oto dane wyjściowe klienta Dev HTTP:
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
Będę zadowolony z wszelkich pomysłów! Dziękuję Ci
RozwiązaniePo pierwsze - dzięki Darrelowi Mirrelowi, który rozwiązał mój cały problem w ciągu kilku sekund :) Potrzebowałem tylko edytować jedną linię w kodzie, dodając HttpCompletitionOption, gdzie uzyskano odpowiedź:
HttpResponseMessage response = m_client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;
Opcja ResponseHeaderRead mówi klientowi, aby zakończył działanie, gdy tylko nagłówki zostaną odczytane bez czytania treści wiadomości.