Node.js与Socket.io – 长轮询失败,并抛出“代码”:1,“消息”:“会话ID未知”响应

我坚持为什么被移动到IIS7服务器的nod​​e.js应用程序现在失败。 我知道IIS7不支持Web套接字,但我的理解是,如果Web套接字不可用,socket.io将回退到长轮询。 所以现在,当用户试图按下通常需要套接字或长轮询的特定button时,我会得到如下所示的内容:

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时,我可以看到响应是"code":1,"message":"Session ID unknown" ,我不明白,因为我可以看到SID。 当我点击列出的失败选项的代码时,我发现问题来自Request.prototype.create,即xhr send:

 xhr.send(this.data); 

有没有人有任何想法可能会导致这些事情?

任何澄清将不胜感激!

非常感谢!

在我的项目中,我尝试将transport选项添加为websocket并且不再显示错误。

 io.connect(url, { "transports": ['websocket'] }) 

这将是支持IE和其他旧浏览器的问题,因为它们不支持本地websocket,如果应用程序浏览器兼容性不是问题,这似乎是一个解决scheme。

对于socket.io v2.0.3(js客户端),当您在客户端使用socket.io时,客户端socket.io将按照如下所述进行一些networking调用:

  1. 当调用io.connect()时,socket.io库调用服务器,看起来像

    ?EIO=3&transport=polling&t=LqtOnHh

    服务器响应类似的东西

    "90:0{"sid":"pcJM_AEZirrJT-DuAAUy","upgrades[], "pingInterval":3600000,"pingTimeout":3600000}2:40"

    这里服务器在服务器端生成一个套接字对象,并将其id发回给客户端。

  2. 在这个客户端再次调用服务器之后,就像这样

    ?EIO=3&transport=polling&t=LqtR6Rn&sid=0JFGcEFNdrS-XBZeAAXM

    这是客户端对服务器进行的长轮询调用,如果您在这里看到它正在传递它在上面的第一个调用中接收到的sessionId,如果调用去往产生该sessionId的同一个节点,则该节点标识该套接字连接该请求已经作出并作出回应。

    但是,在ELB后面,呼叫可能会转到其他没有生成此sessioId的节点,在这种情况下,节点将无法识别进行呼叫的sessionId,因此以{"code":1,"message":"Session ID unknown"}

如果长轮询没有得到应答或超时,您也会看到这个错误。

如果你使用Socket.io-Redis,那么它看起来像在Socket.io的错误跟踪器中描述的情况:

https://github.com/socketio/socket.io/issues/1739#issuecomment-64244359

与socket.io:{“code”:1,“message”:“Session {"code":1,"message":"Session ID unknown"}最近有同样的错误,虽然设置不同(nginx + passenger + nodejs)。 这个问题是从我的NodeJS应用程序的NodeJS到Redis的连接断开。 所以,一旦Redis正确启动(这是一个IP绑定问题),socket.io开始通过networking套接字正确通信。 如果您遇到同样的问题,请检查您的NodeJs应用程序是否正常工作(例如连接到所有必需的资源)

对于我来说,这是与Nginx的SSL HTTP2,这是轮询,所以良好的configuration是:

  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, });