Я пытаюсь получить серию файлов через HTTP, используя HttpWebRequest. Первый запрос проходит через штраф, но второй раз через тот же код GetResponse() зависает и время ожидания. WireShark показывает, что HTTP-трафик не отправляется для второго запроса, поэтому, похоже, это проблема API.HttpWebRequest.GetResponse() зависает во второй раз, когда он называется
После некоторого расследования я обнаружил, что это связано с указанием длины содержимого: если я оставлю это, тогда код работает нормально.
Мой код:
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();
}
Симптомы очень похожи на this question и this question, но в обоих случаях данный совет должен распоряжаться 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;
}
Edit: Оказывается, я совершил смертный грех извлекая кода из моего вопроса, что я не был проверен не связанный с проблемой. Я удалил следующие строки:
if (m_contentLength > 0)
httpWebRequest.ContentLength = m_contentLength;
потому что я думал, что длина содержимого никогда не будет указана для запроса GET. Оказывается, я был неправ. Удаление этой строки устраняет проблему.
Вопрос только в том, почему? I думаю указанная длина содержимого верна, хотя возможно, что она отключена одним. Будет ли указывать слишком длинную длину содержимого, чтобы предотвратить полную загрузку и заставить соединение оставаться открытым? Я бы ожидал, что Close() и/или Dispose() должны убить соединение в любом случае.
Можете ли вы пост ConfigureRequest()? – Gregory
Кроме того, re: http://stackoverflow.com/questions/1386628/webrequest-getresponse-locks-up попробовали настроить значение JSkeet, чтобы упомянуть что-то более высокое, то есть 4 или 8, и посмотреть, не изменит ли это что-нибудь? – Gregory
@Tim Martin: Какую строку убрали? Условие if и значение ContentLength? Таким образом, вы не устанавливаете длину контента вообще? Я попытался удалить настройку ContentLenght, но у меня все еще такая же проблема. – Ted