Я столкнулся с проблемой, когда HttpWebRequest не будет учитывать значение тайм-аута, превышающее 100 секунд при выполнении POST.Однако, если запрос является GET, значение времени ожидания превышает 100 секунд.Исключение тайм-аута выдается при вызове .GetResponse ().Я устанавливаю все значения тайм-аута, которые мне удалось обнаружить, но мне кажется, что я их пропустил, или во фреймворке есть ошибка.
Это приложение C #, предназначенное для .NET Framework 3.5, созданное с использованием Visual Studio 2008. Веб-сервер - IIS 6.0 с тайм-аутом соединения по умолчанию, равным 120 секундам, keep-alives включен ... снова GETзапросы учитывают значение тайм-аута, указанное мной, POST-запросы учитывают тайм-аут, если <= 100 секунд. </p>
Вот мой код:
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 обойти эту проблему?Любые мысли приветствуются, я застрял на этом пару дней.
ОБНОВЛЕНИЕ
Я могу заставить POST соблюдать значение тайм-аута, если я не наденуне публиковать какие-либо данные (что не очень полезно).Однако, как только я публикую какие-либо данные, а ContentLength> 0, время ожидания истекает через 100 секунд.Кроме того, прокси не задействованы.
ОБНОВЛЕНИЕ 2
Добавлены данные POST к примеру и комментарий, где НЕ нужно устанавливать свойство Timeout