Недавно я переключился в нашей тестовой среде с Windows Azure App Services на Linux. Все работает так, как было раньше, кроме наших сокетных соединений. Похоже, что есть много устаревшей информации, касающейся службы приложений Linux, и документация довольно скудная. Однако, согласно этим примечаниям к выпуску , доступна поддержка веб-сокетов в службе приложений Azure Linux.
В некоторых документах службы приложений Azure для Linux говорится, чточто вы должны отключить perMessageDeflate
, чтобы веб-сокеты работали со службой приложений Linux и NodeJS. Я полагаю, что я сделал это в моем коде сервера HapiJS ниже. С помощью console.log(io)
я подтвердил, что для параметра perMessageDeflate
установлено значение false.
import Server from 'socket.io';
import socketioJwt from 'socketio-jwt';
const myHapiJSPlugin = {
name: 'myPluginName',
version: '2.0.0',
register: function (server, options) {
const io = new Server(server.listener, {
perMessageDeflate: false,
transports: ['websocket'],
origins: '*:*'
});
io.use(socketioJwt.authorize({
secret: JWT_SECRET_KEY,
handshake: true
}));
io.on('connection', socket => {
console.log(io);
// more code here
};
};
};
Когда я открываю сетевую страницу консоли Chrome при использовании своего веб-клиента, я получаю 101код ответа с сервера. I console.log
подключается / отключается от обратных вызовов клиента socket.io. Я вижу, что он постоянно подключается / отключается, несмотря на получение подтверждения от сервера (101 ответ). Состояние соединений говорит «остановлено» в консоли. Кажется, я подписываюсь на определенный маршрут в порядке, так как обратный вызов срабатывает.
Я не внес никаких других изменений кода с момента перехода с Windows Azure App Services, несмотря на приведенную ниже конфигурацию для добавления perMessageDeflate
и origins
для тестирования socket.io docs . Я думаю, что что-то идет не так во время рукопожатия или аутентификации.
Status Code: 101 Switching Protocols
Access-Control-Allow-Origin: *
Connection: Upgrade
Date: Tue, 01 Oct 2019 18:04:57 GMT
Sec-WebSocket-Accept: <HASH>
Server: Kestrel
Upgrade: websocket
Я также добавил perMessageDeflate
к моему клиентскому коду. Это не имело значения.
const client = new io(URL, {
query: 'token=' + jwt,
perMessageDeflate: false,
transports: ['websocket'],
upgrade: false
});
Что еще мне не хватает? Как включить веб-сокеты в службе приложений Azure Linux? Я проверил настройки конфигурации, как с Windows. Похоже, что для этого нет настройки, так как веб-сокеты включены по умолчанию. Я проверил в журналах, что веб-сервер не перезапускается постоянно, вызывая соединение / отключение.