длительное соединение http никогда не получает ответ - PullRequest
1 голос
/ 30 октября 2009

Я делаю http-запрос, который занимает более 8 минут. Для меня этот длительный запрос работает нормально. Я могу получить ответ обратно в свой браузер без каких-либо проблем. (Я нахожусь в той же сети, что и сервер).

Однако для некоторых пользователей браузер никогда не возвращает никакого ответа. (Примечание. Когда тот же http-запрос выполняется в течение 1 минуты, эти пользователи могут видеть ответ без каких-либо проблем)

Эти пользователи оказались в другой сети. И, вероятно, существует брандмауэр или два между их расположением и сервером.

Я вижу на их скрипаче, что запрос просто сидит и ждет ответа.

Я сейчас предполагаю, что брандмауэр убивает неактивное http-соединение ... но я не уверен.

Если у вас есть идея, почему ответ никогда не возвращается или почему соединение никогда не разрывается ... это будет действительно полезно.

Также: возможно ли исправить эту проблему, написав Апплет, который каким-то образом удерживает отправляющий фиктивный сигнал на сервер, даже после отправки (сброшенного) запроса на сервер?

Ответы [ 3 ]

1 голос
/ 30 октября 2009

Пользователи могут находиться за брандмауэром отслеживания подключений / шлюзом NAT. Такие шлюзы, как правило, сбрасывают TCP-соединение, когда в течение определенного периода времени ничего не происходит. В настраиваемом протоколе вы могли бы отправлять сообщения о сердцебиении, чтобы поддерживать соединение TCP, но с HTTP вы не можете должным образом контролировать это соединение, а также HTTP не облегчает то, что необходимо, чтобы поддерживать соединение tcp «живым». *

Обычный способ обработки долго выполняющихся заданий, инициированных HTTP-запросом, состоит в том, чтобы запустить это задание в фоновом режиме, немедленно отправив правильный ответ клиенту и запросить апплет / ajax-запрос состояния этого задания и вернуть результат, когда это будет сделано.

Если вам нужно быстрое исправление, посмотрите, можете ли вы контролировать любые тайм-ауты на шлюзах между сервером и пользователем.

0 голосов
/ 29 октября 2013

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
0 голосов
/ 30 октября 2009

Считаете ли вы, что пользователи могут использовать браузер с тайм-аутом HTTP, который заставляет браузер перестать ждать ответа через некоторое время?

...