【问题标题】:Client is not receiving event from SocketIO via IIS Node客户端未通过 IIS 节点从 SocketIO 接收事件
【发布时间】:2018-03-23 07:51:26
【问题描述】:

我有一个 Web 应用程序正在与通过 IIS 节点托管的 NodeJS 服务器建立套接字连接。当我解决了我最初拥有的客户端上的 404 轮询错误时,连接似乎已正确建立。但是现在,客户端似乎没有从 IIS 节点接收套接字事件。

我的理论是,由于 IIS 节点的行为类似于代理,因此发送回客户端的事件在 IIS 节点级别的某处停止。

exports.register = function(socket) {
    User.schema.post('save', function (doc) {
        console.log("Save socket");
        onSave(socket, doc);
    });
}

function onSave(socket, doc, cb) {
    socket.emit('User List Update', doc);
}

在Node中,上面的事件触发了,但是前端没有收到。

客户端如下所示:

var socket = io.connect("http://myinternallyhostedserver:7777/reception");

socket.on('User List Update', function () {
  console.log('Received socket event!');
  if (vm.enableAlert) {
      vm.alertSound.play();
  }
  vm.getUsers();
});

我的 web.config 文件如下所示:

<configuration>
    <appSettings>
        <add key="virtualDirPath" value="/reception" />
    </appSettings>
    <system.webServer>
        <handlers>
            <add name="iisnode" path="server/app.js" verb="*" modules="iisnode" />
        </handlers>
        <iisnode enableXFF="true" />
        <webSocket enabled="false"/>
        <rewrite>
            <rules>
                <rule name="reception">
                    <match url="/*" />
                    <action type="Rewrite" url="server/app.js" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

在我的本地机器上运行所有这些工作正常。套接字事件被发送和接收。将 IIS 节点添加到工作流中似乎是它停止工作的地方。任何帮助将不胜感激。

【问题讨论】:

标签: node.js express iis socket.io iisnode


【解决方案1】:

将 socket.io 与 proxy pass 一起使用时,您需要传递一些变量,例如 upgrade 等。我什至没有尝试使用 iis 来代理 pass socket.io,但我在 apache proxy pass 中遇到了一些问题。所以我选择 nginx 做代理服务器。

也许你需要在 iis 中编写这种参数,或者你可以使用 nginx 作为代理传递服务器。

location / {
        proxy_pass http://socket_nodes_2/doSomething;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

upstream socket_nodes_2 {
    server 192.168.1.155:1338;
    server 192.168.1.156:1338;
}

【讨论】:

  • 我想补充一点,如果你像我一样使用负载均衡的代理传递,你需要在 redis 或 memcache 上处理会话 ^^ ,顺便说一下发布的事件接收到两个节点;)跨度>
猜你喜欢
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 2018-02-27
相关资源
最近更新 更多