node.js - Socket.io/Hapi 不工作 Azure 应用服务 (Linux)

标签 node.js azure socket.io azure-web-app-service hapi

我最近在我们的测试环境中从 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 切换以来,我没有进行任何其他代码更改,尽管使用下面的配置添加 perMessageDeflateorigins 进行测试 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/

相关文章:

flutter - 如何使用flutter发送文件到node.js服务器?

node.js - React-Router 5 和 Express - Catch-All 路由回退

node.js - 如何让多个 Node.js 命令行进程相互通信?

azure - 通过 CLI 使用选项在 Azure DevOps 中创建拉取请求

c# - 在 C# 中从 IoT Hub 获取数据的简单方法

javascript - 用户断开连接后删除 Canvas 和套接字 IO 中的形状

javascript - 如何使用 Node Js、Archiver 和 Express 正确下载 .zip 文件

javascript - Mongoose:如果满足条件,则从 Mongo 中的对象数组中删除元素

api - 无法使用子域进行 Azure API 管理

node.js - 套接字通信