Estoy tratando de buscar una serie de archivos a través de HTTP, utilizando HttpWebRequest. La primera solicitud pasa bien, pero la segunda vez a través del mismo código GetResponse() se cuelga y se agota. WireShark muestra que no se envía tráfico HTTP para la segunda solicitud, por lo que parece que se trata de un problema de API.HttpWebRequest.GetResponse() se cuelga la segunda vez que se llama
Después de algunas investigaciones, descubrí que tiene que ver con la especificación de la longitud del contenido: si lo dejo, el código funciona bien.
Mi código es:
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();
}
Los síntomas parecen muy similares a this question y this question, pero en ambos casos el consejo dado es disponer de la WebResponse, que ya estoy haciendo.
Editar En respuesta a Gregory, aquí es 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: Resulta que he cometido el pecado capital de código de eliminar de mi pregunta que no había verificado era no relacionado con el problema. Había eliminado las siguientes líneas:
if (m_contentLength > 0)
httpWebRequest.ContentLength = m_contentLength;
porque pensé que la longitud del contenido nunca se especificaría para una solicitud GET. Resulta que estaba equivocado. Eliminar esta línea soluciona el problema.
La única pregunta que tengo ahora es ¿por qué? I piensa que la longitud del contenido que se especifica es correcta, aunque es posible que esté desactivada en uno. ¿La especificación de una longitud de contenido demasiado corta impide que se realice la descarga completa y hace que la conexión se deje abierta? Hubiera esperado que Close() y/o Dispose() deberían matar la conexión de todos modos.
Se puede publicar ConfigureRequest()? – Gregory
Además, re: http://stackoverflow.com/questions/1386628/webrequest-getresponse-locks-up ¿ha intentado configurar el valor que JSkeet menciona a algo más alto, es decir, 4 u 8, y ver si esto cambia algo? – Gregory
@Tim Martin: ¿Qué línea eliminaste? ¿La cláusula if y la configuración de ContentLength? Entonces, ¿no establece la duración del contenido en absoluto? Traté de eliminar la configuración de ContentLenght, pero todavía tengo el mismo problema. – Ted