HttpWebRequest.GetResponse () zawiesza się przy drugim wywołaniu

Próbuję pobrać serię plików przez HTTP, używając HttpWebRequest. Pierwsze żądanie jest poprawne, ale po raz drugi przez ten sam kod GetResponse () zawiesza się i wygasa. WireShark pokazuje, że nie jest wysyłany żaden ruch HTTP dla drugiego żądania, więc wydaje się, że jest to problem API.

Po dokładnym zbadaniu odkryłem, że ma to związek z określeniem długości zawartości: jeśli to zostawię, kod działa poprawnie.

Mój kod to:

HttpWebRequest  httpWebRequest = ConfigureRequest();

using (WebResponse webResponse = httpWebRequest.GetResponse())
    // On the second iteration we never get beyond this line
{
    HttpWebResponse httpWebResponse = webResponse as HttpWebResponse;

    using (Stream webResponseStream = httpWebResponse.GetResponseStream())
    {
        if (webResponseStream != null)
        {
            // Read the stream
        }
    }

    statusCode = httpWebResponse.StatusCode;
    httpWebResponse.Close();
}

Objawy wydają się bardzo podobneto pytanie ito pytanie, ale w obu przypadkach wskazówką jest pozbycie się WebResponse, który już robię.

Edytować W odpowiedzi na Gregory'ego znajduje się tutaj ConfigureRequest ():

private HttpWebRequest ConfigureRequest()
{
    string          sUrl            = CreateURL(bucket, key);
    HttpWebRequest  httpWebRequest  = WebRequest.Create(sUrl) as HttpWebRequest;

    httpWebRequest.AllowWriteStreamBuffering = false;
    httpWebRequest.AllowAutoRedirect = true;
    httpWebRequest.UserAgent = this.m_sUserAgent;
    httpWebRequest.Method = "GET";
    httpWebRequest.Timeout = this.m_iTimeout;

    // *** NB: This line was left out of my original posting, and turned out to be
    // crucial
    if (m_contentLength > 0)
        httpWebRequest.ContentLength = m_contentLength;

    httpWebRequest.Headers.Add(StaticValues.Amazon_AlternativeDateHeader, timestamp);
    httpWebRequest.Headers.Add(StaticValues.HttpRequestHeader_Authorization, StaticValues.Amazon_AWS + " " + aWSAccessKeyId + ":" + signature);

    return httpWebRequest;
}

Edytować: Okazuje się, że popełniłem główny grzech usunięcia kodu z mojego pytania, którego nie zweryfikowałem, nie był związany z problemem. Usunąłem następujące wiersze:

    if (m_contentLength > 0)
        httpWebRequest.ContentLength = m_contentLength;

ponieważ myślałem, że długość treści nigdy nie zostanie określona dla żądania GET. Okazuje się, że się myliłem. Usunięcie tej linii rozwiązuje problem.

Jedyne pytanie, jakie teraz mam, to dlaczego? jamyśleć określona długość treści jest poprawna, chociaż możliwe, że jest wyłączona przez jedną. Czy określenie zbyt krótkiej długości treści uniemożliwi pełne pobranie pliku i spowoduje pozostawienie otwartego połączenia? Spodziewałbym się, że Close () i / lub Dispose () powinny i tak zabić połączenie.

questionAnswers(5)

yourAnswerToTheQuestion