为什么 Firefox 不等待 WebSocket 连接?

Why doesn't Firefox wait for WebSocket connection?

我正在编写一个应用程序,它首先尝试打开一个 WebSocket 连接(以确保没有其他人打开;地址冲突检查),然后再触发一个自定义协议,该协议将启动一个 one-time WebSocket 服务器浏览器告诉它的地址。所有通信都是通过本地主机和一些任意端口号完成的,比如 3000。我没有做任何特别的事情,只是试图打开一个 WebSocket:

var socket = new WebSocket("ws://localhost:3000/MyApp/");
socket.onclose = function(e) { console.error(e); }

在 Chrome 中测试时,WebSocket 实际上会在 CONNECTING 状态停留一小段时间,这很理想,因为它给了我们一些时间通过自定义协议实际启动应用程序。但是在 Firefox 中,WebSocket 立即 以代码 1006 关闭,我不明白为什么。

我尝试将 about:config network.websocket.timeout.open 设置更改为 1000(从 20),但这没有帮助。我还发现了这个相关的 post:Websockets - chrome and firefox differences?。这也没有让我找到答案。

我错过了什么?

21 年 11 月 16 日更新
我正在使用 Chrome 和 FF 中的开发工具来检查请求。奇怪的是,Chrome 实际上如您所料发送了一个请求 header,但在 FF 中,该请求完全是空的(0 字节)。也许这是 FF 不支持调试本机 WebSockets(未使用包装器库)的问题?是否有一些 FF 设置会阻止请求?但更令人困惑的是,浏览器会在没有点击打开事件的情况下点击关闭事件。

21 年 11 月 17 日更新
我意识到这可能与启动自定义协议处理程序有关?我注意到如果启动了 no CPH,它将等待一秒钟尝试连接到 Web 服务器,但是当我启动 CPH 时,that 是当它立即关闭 WebSocket 时。 CPH 通过 link 目标“_parent”启动。

自定义协议似乎导致 FF 提前停止尝试连接。我在 JS 代码中创建了一个锚元素 ,并在构造它之后在其上调用了“click()”。无论我给它什么目标(例如 _self),它都会导致连接尝试停止。

长话短说,启动 link,无论是 a.click、window.open 还是 location.replace,都会导致 Firefox 禁止任何当前轮询的 WebSockets !

解决方法是仅使用 iframe 来启动自定义协议。