我最近在我们的测试环境中从 Azure 应用服务 Windows 切换到 Linux。除了我们的套接字连接之外,一切都像以前一样工作。似乎有很多关于 Linux 应用服务的过时信息,而且文档也乏善可陈。然而,根据these release notes ,支持 Azure 应用服务 Linux 上的 Web 套接字。
在 Azure App Service for Linux documentation 的一些中,它指出您必须禁用 perMessageDeflate
才能使 Web Sockets 与 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 响应代码。我 console.log
连接/断开与 socket.io 客户端回调的连接。尽管从服务器获得了确认(101 响应),但我可以看到它不断连接/断开连接。连接状态在控制台中显示“已停止”。当回调触发时,我似乎订阅了特定的路由。
自从从 Azure App Services Windows 切换以来,我没有进行任何其他代码更改,尽管使用下面的配置添加 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 上启用 Web 套接字?我检查了与 Windows 类似的配置设置。似乎没有这样的设置 - 因为默认情况下似乎启用了网络套接字。我已在日志中验证网络服务器不会不断重新启动导致连接/断开连接。
最佳答案
如果身份验证关闭,您的 WebSocket 还能工作吗?
当我启用身份验证功能时,我仅遇到使用 Linux 应用程序的 WebSocket 问题。
我认为这是由于 EasyAuth 代理的实现不佳造成的,并且它被认为是 MS 难以修复的问题。
关于node.js - Socket.io/Hapi 不工作 Azure 应用服务 (Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58190387/