如何防止浏览器在挂起响应时重试 GET 请求
How to prevent browser from retrying GET request when hanging for response
我有一个 RoR API 正在执行分析操作,这可能需要一段时间(2~5 分钟)。
如果在 2 分钟内收到回复,一切正常。浏览器只需挂起 2 分钟,并在获取结果后显示。
现在根据HTTP 1.1规范,现代浏览器会在等待一定时间后自动重试。因此,API 将从同一个客户端获取新请求,如果计算时间过长(例如 3 或 4 分钟),则重新启动所有内容。
如何防止浏览器重试?我只希望我的浏览器无论如何都等待响应并且永远不会重试。
各种浏览器超时(TCP TTL、请求超时、连接超时)是浏览器安装中的设置,无法通过 javascript 等标准方式进行配置。
如果您真的必须找到一种方法来使与服务器的连接保持更长时间,您可以尝试实现 WebSockets,但即使这样也可能受到浏览器、操作系统甚至网络的限制设备(路由器)。
因此,不建议让您的应用程序依赖特定的浏览器行为才能正常运行。也不建议 long-running 进程发生在与服务器的 HTTP 请求处理相同的 thread/process 中,因为失去连接的人可能会导致作业过早终止。您可能想要调查 gem 之类的 Resque 以将 long-running 作业移动到后台进程。
然后您可以让您的 webapp 使用有关后台作业状态的信息立即响应作业请求,您不必担心浏览器请求重新发送或失去连接等。
我有一个 RoR API 正在执行分析操作,这可能需要一段时间(2~5 分钟)。
如果在 2 分钟内收到回复,一切正常。浏览器只需挂起 2 分钟,并在获取结果后显示。
现在根据HTTP 1.1规范,现代浏览器会在等待一定时间后自动重试。因此,API 将从同一个客户端获取新请求,如果计算时间过长(例如 3 或 4 分钟),则重新启动所有内容。
如何防止浏览器重试?我只希望我的浏览器无论如何都等待响应并且永远不会重试。
各种浏览器超时(TCP TTL、请求超时、连接超时)是浏览器安装中的设置,无法通过 javascript 等标准方式进行配置。
如果您真的必须找到一种方法来使与服务器的连接保持更长时间,您可以尝试实现 WebSockets,但即使这样也可能受到浏览器、操作系统甚至网络的限制设备(路由器)。
因此,不建议让您的应用程序依赖特定的浏览器行为才能正常运行。也不建议 long-running 进程发生在与服务器的 HTTP 请求处理相同的 thread/process 中,因为失去连接的人可能会导致作业过早终止。您可能想要调查 gem 之类的 Resque 以将 long-running 作业移动到后台进程。
然后您可以让您的 webapp 使用有关后台作业状态的信息立即响应作业请求,您不必担心浏览器请求重新发送或失去连接等。