WebSocket(Sockjs 和 Stomp)与 ServiceWorkers

WebSocket (Sockjs and Stomp) with ServiceWorkers

我正在使用 Stomp 和 Sockjs 向我的 Spring Boot 独立服务器 (3.1.1) 注册一个 websocket,一切正常。但是,我已经实现了一个 ServiceWorker 来处理离线服务,除了套接字之外,它都可以正常工作。对 ws://localhost/registerSocket 的调用在前端产生了这个错误:

Firefox can't establish a connection to the server at ws://localhost/registerSocket/351/4vevdv79/websocket.

而这个在后端:

ERROR o.s.w.s.s.s.DefaultHandshakeHandler - Handshake failed due to invalid Upgrade header: null

在我的 ServiceWorker 中,我特别将其排除在拦截 ws 请求之外:

if (uri.indexOf("/registerSocket") === -1) {
   event.respondWith(getResponse(event));
}

然而,ws 升级不可避免地会失败,它会恢复到旧的 Comet 样式 polyfill。

有人知道让 websockets 与 ServiceWorker 一起正常工作的方法吗?

fetch service worker 中的事件处理程序只有 triggered in response to HTTP requests。打开 WebSocket 或通过该 WebSocket 传输数据的请求不会触发 fetch 事件处理程序,这意味着服务工作者不会参与。

我刚刚发现 Firefox 44 中的一个错误,该错误会在使用 Service Worker 时阻止 Web Socket 连接工作。

参见this bug report

该错误现在应该已修复(从 Firefox 44.0.1 开始;它甚至在 release notes 中)。