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.