我試圖通過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;
}
編輯:原來我承諾從我的問題刪除代碼的大罪,我還沒有證實是與問題無關。我刪除了以下行:
if (m_contentLength > 0)
httpWebRequest.ContentLength = m_contentLength;
因爲我認爲內容長度永遠不會被指定爲GET請求。原來我錯了。刪除這條線可以解決問題。
我現在唯一的問題是爲什麼?我認爲指定的內容長度是正確的,雖然它可能是關閉的。指定內容長度太短會阻止完全下載並導致連接保持開放狀態?我會期望Close()和/或Dispose()應該終止連接。
您可以發佈ConfigureRequest()? – Gregory 2010-01-14 13:03:41
此外,重試:http://stackoverflow.com/questions/1386628/webrequest-getresponse-locks-up你試過配置JSkeet的值提到更高的東西,即4或8,看看這是否會改變什麼? – Gregory 2010-01-14 13:05:47
@Tim Martin:你刪除了哪一行? if-clause和ContentLength的設置?所以你根本不設置內容長度?我嘗試刪除ContentLenght的設置,但我仍然有同樣的問題。 – Ted 2011-12-04 19:11:30