我正在处理一个搅拌服务器,当我发出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上运行的。我正在重新测试一些我之前没有尝试过的东西,因为它们是针对错误的节点超时的错误否定。
答案 0 :(得分:0)
事实证明答案有点粗糙。
服务器正在发送303响应,表明它仍在处理中。 Location标头指示另一个URL,它将返回另一个303或结果。选择此选项是因为大多数HTTP客户端会自动遵循重定向。
在MS CLR上,这很好用。出于某种原因,在我正在使用的Mono CLR的特定版本中,HttpWebRequest
类在获取重定向时重新发送Content-Length标头。这使Mono内部或服务器中的其他内容混淆等待无法发送的数据,并在1米后连接中断。
我通过将HttpWebRequest的AllowAutoRedirect
属性设置为false并手动处理3xx响应来解决它。看起来Mono的后续版本可能已经修复了问题,但我不想推动服务器管理员升级。