我有一个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节点添加到工作流程似乎是它停止工作的地方。任何帮助将不胜感激。
答案 0 :(得分:2)
在使用socket.io与代理传递时,你需要传递一些变量,如升级等。我甚至没有尝试使用iis代理传递socket.io但我在apache代理传递中遇到了一些问题。因此我选择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;
}