在执行 POST 时,无法将 HttpWebRequest 超时设置为高于 100 秒?



我遇到了一个问题,HttpWebRequest在做POST时不会尊重超过100秒的超时值。但是,如果请求是GET,则会考虑高于100秒的超时值。在. getresponse()调用时抛出超时异常。我正在设置我已经能够发现的所有超时值,但似乎我缺少一个,或者在框架中有一个错误。

这是一个针对。net框架3.5的c#应用程序,使用Visual Studio 2008构建。web服务器是IIS 6.0,连接超时设置为默认的120秒,启用了keep-alive…同样,GET请求尊重我指定的超时值,POST请求尊重我指定的超时值,如果<= 100秒。

下面是我的代码:
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属性

我明白了。这是DRY编码回来的一个例子,并咬了我的屁股。上面的代码是我的真实代码的释义,因此上面的代码将正常工作。

问题是我在已经调用proxyRequest.GetRequestStream()添加POST数据后设置了Timeout值。因为我同时设置了TimeoutReadWriteTimeout属性,所以最短的超时是获胜的。在POST请求的情况下,尽管框架允许我在调用GetRequestStream后设置超时值,但它忽略了所设置的任何值(而是使用默认的100秒,即使在设置后检查Timeout属性显示它被设置为我期望的值)。我希望设置超时属性与设置ReadWriteTimeout属性一样:如果您在调用GetRequestStream后尝试设置ReadWriteTimeout属性,它会抛出异常。如果Timeout做了同样的事情,那将节省我大量的时间。我应该早点发现这个问题的,但是我把它记为一次学习经历。

所以这个故事的寓意是:当你创建HttpWebRequest时,为它设置所有的超时属性

您的客户端和服务器之间有web代理吗?也许这是使用超时本身。

我建议您使用Wireshark来查看网络级别上发生的事情-特别是100秒内网络上是否发生了任何事情。

相关内容

  • 没有找到相关文章

最新更新