HttpWebRequest.GetResponse () trava a segunda vez que é chamado

Eu estou tentando buscar uma série de arquivos via HTTP, usando HttpWebRequest. O primeiro pedido passa bem, mas a segunda vez através do mesmo código GetResponse () trava e expira. O WireShark mostra que nenhum tráfego HTTP está sendo enviado para a segunda solicitação, portanto, parece que é um problema da API.

Depois de alguma investigação, descobri que isso tem a ver com a especificação do tamanho do conteúdo: se eu deixar isso de fora, o código funciona bem.

Meu código é:

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

Os sintomas parecem muito semelhantes aosessa questão eessa questão, mas em ambos os casos o conselho dado é dispor do WebResponse, que já estou fazendo.

Editar Em resposta a Gregory, aqui está 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;
}

Editar: Acontece que eu cometi o pecado principal de remover código da minha pergunta que eu não tinha verificado não estava relacionado ao problema. Eu tinha removido as seguintes linhas:

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

porque pensei que o tamanho do conteúdo nunca seria especificado para uma solicitação GET. Acontece que eu estava errado. Remover esta linha resolve o problema.

A única questão que tenho agora é por quê? Eupensar o comprimento do conteúdo especificado está correto, embora seja possível desativá-lo em um. A especificação de um comprimento de conteúdo que é muito curto impede o download completo e faz com que a conexão seja deixada em aberto? Eu teria esperado que Close () e / ou Dispose () deveria matar a conexão de qualquer maneira.

questionAnswers(5)

yourAnswerToTheQuestion