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