Я разместил приложение js узла WebSocket на виртуальной машине AZURE под управлением Windows Server 2016 с IISNode.Когда я обращаюсь к нему через браузер на том же сервере, где размещено приложение, WebSocket работает, но когда я получаю к нему доступ через браузер некоторой удаленной машины, я получаю следующую ошибку «Сбой соединения WebSocket с ws: //somewebsite.com/sampleServer»: Неверный заголовок фрейма "
Код на стороне сервера:
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>