如何让HttpWebRequest.GetResponse()更慢地超时?

时间:2015-07-06 19:11:42

标签: .net httpwebrequest

我正在处理一个搅拌服务器,当我发出POST请求时需要很长时间才能发送响应。我不能使用.NET 4.5,所以我一直在使用HttpWebRequest,最近使用WebClient。服务器通过POST接受一些数据,需要很长时间(通常是5-7分钟)来处理它,然后生成一个响应以指示结果。

我所看到的内容表明.NET中的某些内容在WebRequest.GetResponse()上超时约为2分钟,而我所做的任何事情似乎都不会影响这一点:

  • 代码的第一个版本是完全同步的。我将HttpWebRequest的{​​{1}}和Timeout设置为10米,但在2分钟后,抛出状态为“ReceiveFailure”的WebException。
  • 我使用ReadWriteTimeout测试了一个版本,但遇到了类似的失败。我也注意到我不应该在同一个请求上使用同步BeginGetResponse(),所以它代表了一些相当大的变化,因为我最终希望这个API看起来是同步的。
  • 我尝试使用GetRequestStream(),但它有类似的问题。在2分钟时,它会抛出WebException(虽然这次是使用ConnectionClosed)。

我尝试过使用像WebClient.UploadStringAsync()这样的属性,并没有改变任何东西。我尝试过使用ServicePointManager.MaxServicePointIdleTime。我已经在SO上阅读了几个类似的问题,但似乎没有任何建议对我的情况有用。感觉有一些超时,我无法控制阻碍,但它也感觉应该有一种方法来配置它。我错过了什么?这是我的代码同步版本的一个粗略示例,这里没什么特别的:

HttpWebRequest.KeepAlive

更新 一些神秘的问题已经解决,因为我没有意识到Node在2分钟就有一个套接字超时。当我将其设置为15米时,指向我的节点服务器的Windows实例很乐意等待很长时间。但是生产环境是通过Mono在Linux上运行的。我正在重新测试一些我之前没有尝试过的东西,因为它们是针对错误的节点超时的错误否定。

1 个答案:

答案 0 :(得分:0)

事实证明答案有点粗糙。

服务器正在发送303响应,表明它仍在处理中。 Location标头指示另一个URL,它将返回另一个303或结果。选择此选项是因为大多数HTTP客户端会自动遵循重定向。

在MS CLR上,这很好用。出于某种原因,在我正在使用的Mono CLR的特定版本中,HttpWebRequest类在获取重定向时重新发送Content-Length标头。这使Mono内部或服务器中的其他内容混淆等待无法发送的数据,并在1米后连接中断。

我通过将HttpWebRequest的AllowAutoRedirect属性设置为false并手动处理3xx响应来解决它。看起来Mono的后续版本可能已经修复了问题,但我不想推动服务器管理员升级。