即使设置了无限超时,Webrequest 也会超时

Posted

技术标签:

【中文标题】即使设置了无限超时,Webrequest 也会超时【英文标题】:Webrequest timed out even with infinite timeout set 【发布时间】:2021-11-23 19:15:33 【问题描述】:

我有一个使用外部节点模块打开 HttpWebRequest 的 C# 方法。

然后执行一些长的数据库查询,处理这些数据并将它们发送到节点模块。

节点模块通过套接字接收来自c#的数据,并将此数据转换为将返回给c#的其他数据。

对于一些需要大约 30 分钟过程的测试,一切正常。但是一个更大的测试需要大约 2 小时,我有 the request was aborted the operation has timed out

这是我的代码的一部分:

HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
request.ContentType = "application/json";
request.Method = "POST";
request.Timeout = -1;
request.KeepAlive = false; // both true & false values were tested, but gave the same result
request.ServicePoint.ConnectionLeaseTimeout = -1;
request.ServicePoint.MaxIdleTime = -1;
Stream st = request.GetRequestStream();
StreamWriter stw = new StreamWriter(st);
stw.Write("");

//Long process of data, queries executions and writing in stw that is received by the node module

//this line is where it throw the exception of timeout, and here is where I'm supposed to get the output from the node module, based on what I've sent
Stream stmResponse = request.GetResponse().GetResponseStream();

不应断开连接,因为它是从 C# 连续发送的数据,由节点模块立即处理。

我还更改了 web.config 中的超时配置

  <system.web>
    <httpRuntime executionTimeout="180000" /> ...

【问题讨论】:

Keep Alive 应该是 TRUE。 不管怎样,我不相信一个网络请求应该持续两个小时。提交请求,将其放入队列中,将请求出列到某个服务中,然后让用户稍后返回到其他 URL 以查看他们的工作是否完成。 我已经用更多上下文编辑了我的问题。 @jdweng 我尝试了值“true”,但给出了相同的结果。 我会检查数据库的日志文件,看看是否有任何错误。您有一个两端口应用程序,您的客户端代码向服务器发出请求,服务器向数据库发出查询。错误可能发生在服务器和数据库之间的接口上,而不是在客户端和服务器之间的连接上。 你检查数据库日志文件了吗? 【参考方案1】:

服务器是否需要 2 小时才能响应?

如果没有,那为什么不立即得到响应,然后继续处理,而不是让流打开 2 小时?

无论如何,在这种情况下,您已将 客户端 的超时设置为无限,但是,由于缺少 Keep-Alive 标头,服务器可能会阻止您。

试试这个:

request.KeepAlive = true;

【讨论】:

【参考方案2】:

我找出了问题的根源,这与代码完全无关,因为通过 *** 和防火墙完成的与外部模块的连接已经到位,并且两者都在切断连接一定的时间。

删除 *** 和防火墙后,不再抛出超时异常。

【讨论】:

以上是关于即使设置了无限超时,Webrequest 也会超时的主要内容,如果未能解决你的问题,请参考以下文章

即使在设置 c3p0.testConnectionOnCheckout=true 之后,与 MySQL 的数据库连接也会超时

即使使用'autoReconnect = true',MySql JDBC 也会超时 [重复]

如何设置视图超时?

WebRequest.GetRequestStreamAsync()方法每次MNS访问令牌超时

如何正确设置浏览器创建的桌面通知的无限超时

上传时webclient超时