【问题标题】:Node.js with Socket.io - Long Polling fails and throws "code":1,"message":"Session ID unknown" response带有 Socket.io 的 Node.js - 长轮询失败并抛出 "code":1,"message":"Session ID unknown" 响应
【发布时间】:2015-08-23 04:25:46
【问题描述】:

我不知道为什么一个移到 IIS7 服务器的 node.js 应用程序现在失败了。我知道 IIS7 不支持 Web 套接字,但我的理解是,如果 Web 套接字不可用,socket.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 时,我可以看到响应是 "code":1,"message":"Session ID unknown",我不明白,因为我可以看到 SID。当我单击为该选项列出的失败代码时,我看到问题来自 Request.prototype.create,即 xhr 发送:

xhr.send(this.data);

有谁知道是什么导致了这些事情?

任何澄清将不胜感激!

非常感谢!

【问题讨论】:

    标签: javascript node.js sockets iis-7 long-polling


    【解决方案1】:

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

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

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

    【讨论】:

    • 我在 chrome 中遇到了这个问题。过去 1 天一直在努力解决这个问题。非常感谢您的解决方案。
    【解决方案2】:

    对我来说,它是使用 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,
        });
    

    【讨论】:

      【解决方案3】:

      如果你使用 Socket.io-Redis,那么它看起来就像 Socket.io 的 bug tracker 中描述的情况:

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

      【讨论】:

        【解决方案4】:

        对于socket.io v2.0.3(js客户端),当您在客户端使用socket.io时,客户端socket.io会按照说明进行一些网络调用:

        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 库中的轮询,而只使用它的 websockets 配置
        • @ShahidHussain 我遇到了同样的错误,您能否提出解决方案来消除此错误并在具有多台服务器的负载均衡器上运行 nodejs 应用程序。如果您分享解决方案,它将对我有所帮助。提前致谢。
        • 我一直在运行一个服务器。在第一个带有sid 的请求上,返回200,但之后使用相同的sid 服务器响应400
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2014-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 2015-06-25
          • 2016-01-12
          • 1970-01-01
          • 2014-09-03
          相关资源
          最近更新 更多