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

Posted

技术标签:

【中文标题】IISNode WebSocket 从远程浏览器抛出错误“与 \'ws://somewebsite.com/sampleServer\' 的 WebSocket 连接失败:帧头无效”【英文标题】: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>

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于IISNode WebSocket 从远程浏览器抛出错误“与 'ws://somewebsite.com/sampleServer' 的 WebSocket 连接失败:帧头无效”的主要内容,如果未能解决你的问题,请参考以下文章

运维开发:python websocket网页实时显示远程服务器日志信息

Boost Beast 将带有字节数组的 json 发送到客户端抛出 websocket

如何从远程机器访问 websocket

让 WebSocket 从远程 URL 工作

asp.net WebAPI 问题 iisnode默认不支持PUT和DELETE的解决

如何从远程 ip 中的 C# 访问 websocket URL?