我正在制作一个http请求,最终需要花费超过8分钟。对我来说,这个长期运行的请求工作正常。我能够在没有任何问题的情况下回复我的浏览器。 (我与服务器位于同一网络上。)
但是,对于某些用户,浏览器永远不会返回任何响应。 (注意:当1分钟内执行相同的http请求时,这些用户可以毫无问题地看到响应)
这些用户碰巧在另一个网络上。并且它们的位置和服务器之间可能存在防火墙或两个防火墙。
我可以在他们的小提琴手上看到请求只是坐在那里等待回应。
我现在假设防火墙正在杀死空闲的http连接..但我不确定。
如果您知道为什么响应永远不会回来,或者为什么连接永远不会中断......这将非常有用。
另外:是否有可能通过编写一个Applet来解决这个问题,即使在将请求发送(刷新)到服务器之后,该Applet仍以某种方式设法将发送虚拟信号保持在服务器上?
答案 0 :(得分:1)
用户可能在连接跟踪防火墙/ NAT网关后面。当一段时间内没有发生任何事情时,这种网关往往会丢弃TCP连接。在自定义协议中,您可以发送某种心跳消息来保持TCP连接的活动,但是使用HTTP,您无法正确控制该连接,HTTP也不会促进保持tcp连接“活动”所需的内容。
处理HTTP请求启动的长时间运行作业的常用方法是在后台启动该作业,立即向客户端发送适当的响应,并让applet / ajax请求轮询该作业的状态并返回完成后的结果。
如果您需要快速修复,请查看您是否可以控制服务器和用户之间网关的任何超时。
答案 1 :(得分:0)
您是否认为用户可能正在使用具有HTTP超时的浏览器,导致浏览器在一段时间后停止等待响应?
答案 2 :(得分:0)
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html
如果您使用的是Linux机器,请尝试
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
# echo 1500 > /proc/sys/net/ipv4/tcp_keepalive_time
# echo 500 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes