簡體   English   中英

在執行POST時,無法將HttpWebRequest超時設置為高於100秒?

[英]Can't set HttpWebRequest timeout higher than 100 seconds when doing a POST?

我遇到了一個問題,HttpWebRequest在執行POST時不會尊重超過100秒的超時值。 但是,如果請求是GET,則會遵循高於100秒的超時值。 在.GetResponse()調用時拋出超時異常。 我正在設置我能夠發現的所有超時值,但似乎我錯過了一個,或者框架中有一個錯誤。

這是一個針對.NET Framework 3.5的C#應用​​程序,使用Visual Studio 2008構建.Web服務器是IIS 6.0,連接超時設置為默認的120秒,啟用了保持活動...再次GET請求尊重超時值I指定,如果<= 100秒,POST請求將遵守超時。

這是我的代碼:

int timeout = 200000; // 200 seconds
HttpWebRequest proxyRequest = (HttpWebRequest)WebRequest.Create(serverUrl);
proxyRequest.Accept = clientRequest.AcceptTypes.ToDelimitedString(", ");
proxyRequest.Method = "POST"
proxyRequest.UserAgent = clientRequest.UserAgent;
proxyRequest.Timeout =  timeout;
proxyRequest.ReadWriteTimeout = timeout;
proxyRequest.KeepAlive = false;
proxyRequest.AllowAutoRedirect = false;
proxyRequest.ServicePoint.Expect100Continue = false;
proxyRequest.ServicePoint.MaxIdleTime = timeout;
proxyRequest.ServicePoint.ConnectionLeaseTimeout = -1;

try
{
    // add post data
    request.ContentType = "application/x-www-form-urlencoded";
    byte[] postData = Encoding.UTF8.GetBytes("somedata=7&moredata=asdf");
    // set some post data
    request.ContentLength = postData.Length;
    using (Stream stream = request.GetRequestStream())
    {
        stream.Write(postData, 0, postData.Length);
        stream.Close();
    }

    // UPDATE
    // don't set Timeout here! It will be ignored
    // proxyRequest.Timeout = timeout;

    // Timeout exception thrown here if GetResponse doesn't return within 100 seconds
    // even though the Timeout value is set to 200 seconds.
    using (HttpWebResponse proxyResponse = (HttpWebResponse)proxyRequest.GetResponse())
    {
        using (Stream stream = proxyResponse.GetResponseStream())
        {
            using (StreamReader reader = new StreamReader(stream, Encoding.Default))
            {
                string content = reader.ReadToEnd();
                [other pointless code for this example]
                reader.Close();
            }
            stream.Close();
        }
        proxyResponse.Close();
    }
}
finally
{
    proxyRequest.Abort();
}

當我將超時值設置為5秒時,我將在5秒后收到超時異常,正如人們所期望的那樣。 這證明Timeout值未被完全忽略。

還有其他人遇到過這個問題嗎? 使用Async版本的GetResponse會解決這個問題嗎? 任何和所有的想法都歡迎,我已經堅持了幾天。

UPDATE

如果我不發布任何數據(這不是很有用),我可以讓POST尊重超時值。 但是,只要我發布任何數據並且ContentLength> 0,它就會超過100秒。 此外,不涉及代理。

更新2

將POST數據添加到示例中,並在不設置Timeout屬性的位置添加注釋

我想到了。 這是一個DRY編碼回來並咬我的屁股的例子。 上面的代碼是我的真實代碼的解釋,因此上面的代碼將正常工作。

問題是我在調用proxyRequest.GetRequestStream()以添加POST數據后設置了Timeout值。 因為我正在設置TimeoutReadWriteTimeout屬性,所以最短的超時是贏。 在POST請求的情況下,即使框架讓我在調用GetRequestStream之后設置Timeout值,它也會忽略設置的任何值(而是使用默認的100秒,即使在設置它之后檢查Timeout屬性顯示它是設置為我所期望的)。 我希望設置Timeout屬性與設置ReadWriteTimeout屬性相同:如果在調用GetRequestStream后嘗試設置ReadWriteTimeout屬性,則會拋出異常。 如果Timeout做了同樣的事情,那將節省我一點時間。 我應該早點抓住這個,但我會把它歸結為學習經驗。

故事的寓意:在創建HttpWebRequest時立即設置所有超時屬性。

您的客戶端和服務器之間是否有Web代理? 也許那就是使用超時本身。

我建議你使用Wireshark來查看網絡級別發生了什么 - 特別是網絡上是否有任何事情發生在100秒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM