长时间运行http连接永远不会得到回应

问题描述:

我正在发出一个http请求,最终需要超过8分钟。对我来说,这个长时间运行的请求很好。我可以毫无问题地回复我的浏览器。 (我与服务器位于同一网络中)。长时间运行http连接永远不会得到回应

但是,对于某些用户,浏览器不会返回任何响应。 (注意:当1分钟内执行相同的http请求时,这些用户可以毫无问题地看到响应)

这些用户碰巧在另一个网络上。在他们的位置和服务器之间可能有一两个防火墙。

我可以看到他们的提琴手,请求只是坐在那里等待响应。

我现在假设防火墙正在查杀闲置的http连接..但我不确定。

如果您有任何想法,为什么响应永不回头,或为什么连接永不中断..这将是非常有益的。

另外:是否有可能通过编写一个Applet来解决这个问题,即使在发送(刷新)请求到服务器之后,以某种方式设法保持发送虚拟信号到服务器?

用户可能位于连接跟踪防火墙/ NAT网关的后面。当一段时间没有发生任何事情时,这些网关倾向于丢弃TCP连接。在自定义协议中,您可以发送某种心跳消息以保持TCP连接处于活动状态,但对于HTTP,您无法正确控制该连接,HTTP也不利于保持tcp连接“活动”所需的内容。

处理由HTTP请求启动的长时间运行的作业的常用方法是在后台触发该作业,立即发送适当的响应回到客户端并让applet/ajax请求轮询该作业的状态并完成后返回结果。

如果您需要快速修复,请参阅您是否可以控制服务器和用户之间的网关上的任何超时。

+0

在我上次的评论中,我提到用户能够在IIS服务器上运行长时间运行的请求,所以即使大多数手指指向防火墙,我也很难得出这个结论。 btw,请求失败的服务器是linux + weblogic/websphere。 – rjk2008 2009-10-30 14:02:54

+0

将此评论标记为答案,但说实话,我并不接近解决问题。如果我们找到一种方法来在服务器端“没有”使用任何新工具(冰面,彗星等)进行长时间同步过程,将会在这里更新。现在轮询似乎并不比现在更具吸引力。 – rjk2008 2009-11-02 16:52:07

+0

只需找到一种方法来使用Ethereal监控防火墙的每个支路上的数据包。并查看数据包是否在任何地方停止。Apache具有简单的Timeout指令,其默认值为300秒,其中包括控制响应超时的时间。 Websphere似乎有一个timle配置phleora,我不能确定哪一个你需要调整 - 但有可能是你可能需要调整的设置 - 可能ConnectionResponseTimeout – nos 2009-11-02 18:06:23

您是否认为用户可能正在使用具有HTTP超时的浏览器,这会导致浏览器在一段时间后停止等待响应?

+0

的问题是,用户能够运行长要求将AA Windows的IIS服务器...所以我不认为它与浏览器有关。 – rjk2008 2009-10-30 13:59:51

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