node.js - Socket.io/Hapi 不工作 Azure 应用服务 (Linux)
问题描述
我最近在我们的测试环境中从 Azure 应用服务 Windows 切换到了 Linux。除了我们的套接字连接之外,一切都像以前一样工作。似乎有很多关于 Linux App Service 的过时信息,文档也乏善可陈。但是,根据这些发行说明,Azure App Service Linux 上的 Web 套接字支持可用。
在一些适用于 Linux 的 Azure App Service 文档中,它声明您必须禁用perMessageDeflate
才能使 Web Sockets 与 Linux App Service 和 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
};
};
};
当我使用 Web 客户端打开 Chrome 控制台的网络页面时,我从服务器收到 101 响应代码。我console.log
从 socket.io 的客户端回调连接/断开连接。尽管得到了服务器的确认(101 响应),但我可以看到它不断地连接/断开连接。连接状态在控制台中显示“已停止”。当回调触发时,我似乎订阅了一个特定的路由。
perMessageDeflate
尽管下面的配置用于添加和origins
测试socket.io docs ,但自从从 Azure App Services Windows 切换后,我没有进行任何其他代码更改。我认为在握手或身份验证期间出了点问题。
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 的配置设置。似乎没有设置 - 因为默认情况下似乎启用了 Web 套接字。我在日志中验证了 Web 服务器不会不断重新启动导致连接/断开连接。
解决方案
如果身份验证关闭,您的 WebSockets 是否工作?
当我启用身份验证功能时,我只会遇到使用 Linux 应用程序的 WebSockets 问题。
我认为这是由于 EasyAuth 代理的实施不善造成的,并且它被认为是 MS 难以解决的问题。
推荐阅读
- angularjs - Angular 7 等价于用于元素克隆的 angularJS 代码
- android - 矢量图像在 Android 中显示错误
- html - 如何将出现的文本放置在最后一个图像头像的位置?
- twitter-bootstrap - Bootstrap btn-group flex-wrap 问题
- regex - 我将如何处理单个或多个字符串的 argparse?
- reactjs - 无法运行包裹命令
- javascript - 反应中的地图不返回多个元素?
- php - 组合两个单个数组并形成一个关联数组
- swift - 在功能中使用 ARKit 更改 SCNNode 正在使应用程序停止运行
- python - 如何在列表中找到每个项目的出现并打印其每个出现的索引号?