Ich versuche, eine Reihe von Dateien über HTTP mit HttpWebRequest zu holen. Die erste Anfrage läuft gut, aber das zweite Mal durch den gleichen Code GetResponse() hängt und Timeout. WireShark zeigt, dass für die zweite Anforderung kein HTTP-Datenverkehr gesendet wird. Daher scheint es, dass es sich um ein API-Problem handelt.HttpWebRequest.GetResponse() hängt beim zweiten Aufruf
Nach einigen Untersuchungen habe ich festgestellt, dass es mit der Angabe der Länge des Inhalts zu tun hat: Wenn ich das weglassen, dann funktioniert der Code gut.
Mein Code ist:
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();
}
Die Symptome sehr ähnlich scheinen this question und this question, aber in beiden Fällen die gegebene Rat ist der WebResponse zu entsorgen, die ich bereits tue.
bearbeiten Als Reaktion auf Gregory, hier ist 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;
}
bearbeiten: Es stellt sich heraus, dass ich die Todsünde des Entfernens von Code aus meiner Frage begangen, dass ich nicht überprüft hatte, ohne Bezug auf das Problem. Ich hatte die folgenden Zeilen entfernt:
, weil ich dachte, dass content-length nie für eine GET-Anfrage angegeben werden würde. Es stellt sich heraus, dass ich falsch lag. Durch das Entfernen dieser Zeile wird das Problem behoben.
Die einzige Frage, die ich jetzt habe, ist warum? I denke, die angegebene Inhaltslänge ist korrekt, obwohl es möglich ist, ist es um eins. Würde die Angabe einer zu kurzen Inhaltslänge verhindern, dass der vollständige Download stattfindet und die Verbindung offen bleibt? Ich hätte erwartet, dass Close() und/oder Dispose() die Verbindung sowieso beenden sollten.
Können Sie ConfigureRequest post()? – Gregory
Auch, re: http://stackoverflow.com/questions/1386628/webrequest-getresponse-locks-up haben Sie versucht, den Wert zu konfigurieren, den JSkeet zu etwas höher, dh 4 oder 8 erwähnt, und sehen, ob das etwas ändert? – Gregory
@Tim Martin: Welche Zeile hast du entfernt? Die if-Klausel und die Einstellung von ContentLength? Also legen Sie die Inhaltslänge überhaupt nicht fest? Ich habe versucht, die Einstellung von ContentLength zu entfernen, aber ich habe immer noch das gleiche Problem. – Ted