我被一个节点的原因难住了。移动到IIS7服务器的js应用程序现在失败。我知道IIS7不支持web套接字,但我的理解是该套接字。如果web套接字不可用,io将退回到长轮询。因此,现在当用户尝试按下一个特定按钮时,通常需要套接字或长轮询,我得到如下结果:
XHR finished loading: POST "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777964357-6&sid=QWsESi0c9ih7WMWKAAAC".
GET https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC 400 (Bad Request)
XHR finished loading: GET "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC".
OPTIONS https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC
XMLHttpRequest cannot load https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC. Invalid HTTP status code 400
当我点击GET或XMLHttpRequest时,我可以看到响应是代码: 1,消息:"会话ID未知"
,我不明白,因为我可以看到SID。当我点击列出的失败选项的代码时,我看到问题来自Request.prototype.create,即xhr发送:
xhr.send(this.data);
有人知道是什么导致了这些东西吗?
如有任何澄清,将不胜感激!
非常感谢你!
对于socket.iov2.0.3(js客户端),当您在客户端使用socket.io时,客户端socket.io进行一些网络调用,如下所述:
>
当木卫一。调用connect(),即套接字。io库调用服务器,如下所示
?EIO=3
服务器的响应如下
“90:0{”sid:“pcJM_AEZirrJT-DuAAUy”,“升级[],“pingInterval”:3600000,“pingTimeout”:3600000}2:40”
这里,服务器在服务器端生成一个套接字对象,并将其id发送回客户端。
在这个客户端对服务器进行另一个调用后,类似于
?EIO=3
这是客户端对服务器的长轮询调用,如果您在这里看到它正在传递它在上面的第一个调用中接收到的sessionId,如果调用转到生成该sessionId的同一个节点,则该节点标识已发出请求并响应的套接字连接。
但是在ELB后面,调用可能会转到没有生成此sessionId的其他节点,在这种情况下,该节点将无法识别为其进行调用的sessionId,因此响应为{“code”:1,“message”:“Session ID unknown”}
如果长时间轮询未得到响应或超时,您也会看到此错误。
在我的项目中,我尝试将transport
选项添加为websocket
,错误不再出现。
io.connect(url, {
"transports": ['websocket']
})
这将是一个问题,支持IE和其他旧的浏览器,因为他们不支持本机网络套接字,如果应用程序浏览器的兼容性不是一个问题,这似乎是一个解决方案。
对我来说,它是使用nginx ssl http2的,它是轮询的,所以好的配置是:
const ioSocket = io('', {
// Send auth token on connection, you will need to DI the Auth service above
// 'query': 'token=' + Auth.getToken()
path: '/socket.io',
transports: ['websocket'],
secure: true,
});