HttpWebRequest.GetResponse () зависает при втором вызове

Я пытаюсь получить серию файлов через HTTP, используя HttpWebRequest. Первый запрос проходит нормально, но второй раз через тот же код GetResponse () зависает и время ожидания. WireShark показывает, что HTTP-трафик не отправляется для второго запроса, поэтому может показаться, чтопроблема с API.

После некоторого расследования яМы обнаружили, что это связано с указанием длины содержимого: если я пропущу это, то код работает нормально.

Мой код:

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();
}

Симптомы кажутся очень похожими наэтот вопрос а такжеэтот вопрос, но в обоих случаях дан совет избавиться от WebResponse, который яЯ уже делаю.

редактировать В ответ на Грегори, вот 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;
}

редактировать: Оказывается, я совершил кардинальный грех удаления кода из моего вопроса, который у меня не былоПроверено не было связано с проблемой. Я удалил следующие строки:

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

потому что я думал, что длина содержимого никогда не будет указана для запроса GET. Оказывается, я был не прав. Удаление этой строки устраняет проблему.

Единственный вопрос, который у меня сейчас есть, почему? ясчитать указанная длина содержимого является правильной, хотявозможно этос одного. Будет ли указание слишком короткой длины содержимого препятствовать полной загрузке и будет ли соединение оставаться открытым? Я ожидал бы, что Close () и / или Dispose () должны все равно уничтожить соединение.

Ответы на вопрос(5)

Ваш ответ на вопрос