IISNode WebSocket从远程浏览器抛出错误“ WebSocket与'ws://somewebsite.com/sampleServer'的连接失败:无效的帧头”

时间:2019-04-11 11:33:33

标签: node.js websocket iisnode

我已将WebSocket节点js应用程序托管到运行带有IISNode的Windows Server 2016的AZURE VM。 当我通过托管应用程序的同一台服务器上的浏览器访问它时,WebSocket起作用,但是当我通过某个远程计算机的浏览器访问它时,出现以下错误 “与'ws://somewebsite.com/sampleServer'的WebSocket连接失败:无效的帧头”

服务器端代码:

var ws = require("ws");

var app = express();

app.use(express.static(__dirname));

var server = app.listen(process.env.PORT, "0.0.0.0");
var wss = new ws.Server({
noServer: true,
perMessageDeflate: false
});
server.on('upgrade', function (request, socket, head) {
var pathname = request.url ? url.parse(request.url).pathname : undefined;
if (pathname === '/sampleServer') {
    wss.handleUpgrade(request, socket, head, function (webSocket) {
        var socket = {
            send: function (content) { return webSocket.send(content, function (error) {
                if (error) {
                    throw error;
                }
            }); },
            onMessage: function (cb) { return webSocket.on('message', cb); },
            onError: function (cb) { return webSocket.on('error', cb); },
            onClose: function (cb) { return webSocket.on('close', cb); },
            dispose: function () { return webSocket.close(); }
        };
        // launch the server when the web socket is opened
        if (webSocket.readyState === webSocket.OPEN) {
            pses_launcher_1.launch(socket);
        }
        else {
            webSocket.on('open', function () { return 
            pses_launcher_1.launch(socket); });
        }
    });
}
});

**客户端代码**

const ReconnectingWebSocket = require('reconnecting-websocket');
const url = createUrl('/sampleServer')
const webSocket = createWebSocket(url);

function createUrl(path: string): string {

return 
normalizeUrl(`ws://${location.host}${location.pathname}${path}`);
}

function createWebSocket(url: string): WebSocket {
const socketOptions = {
    maxReconnectionDelay: 10000,
    minReconnectionDelay: 1000,
    reconnectionDelayGrowFactor: 1.3,
    connectionTimeout: 10000,
    maxRetries: Infinity,
    debug: false
};
return new ReconnectingWebSocket(url, undefined, socketOptions);
}

经过研究,我将web.config文件设置为

<configuration>
<system.webServer>
<handlers>
  <add name="iisnode" path="server.js" verb="*" modules="iisnode" />
</handlers>
<rewrite>  
 <rules>  
      <rule name="LogFile" patternSyntax="ECMAScript">  
           <match url="sampleServer" />  

     <serverVariables>
                  <set name="HTTP_CONNECTION" value="Upgrade" />
              </serverVariables>      
           <action type="Rewrite" url="server.js" />  
      </rule>  
 </rules>  
 </rewrite> 
  <webSocket enabled="false" />

  </system.webServer>
  </configuration>

1 个答案:

答案 0 :(得分:0)

由于我的网络上安装了某些防火墙,因此出现了问题。 一旦我将通信转移到通过SSL的wss上,它便开始工作。