【问题标题】:IISNode WebSocket throwing error from remote browser "WebSocket connection to 'ws://somewebsite.com/sampleServer' failed: Invalid frame header"IISNode WebSocket 从远程浏览器抛出错误“与 'ws://somewebsite.com/sampleServer' 的 WebSocket 连接失败:帧头无效”
【发布时间】:2019-04-11 11:33:32
【问题描述】:

我已将 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>

【问题讨论】:

    标签: node.js websocket iisnode


    【解决方案1】:

    这是一个问题,因为我的网络上安装了一些防火墙。 一旦我将通信转移到 wss(通过 SSL),它就开始工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-17
      • 2023-01-17
      • 2021-01-30
      • 2023-01-30
      • 2017-02-12
      • 2014-12-19
      • 2016-01-29
      • 2021-09-16
      相关资源
      最近更新 更多