首页 > 解决方案 > 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 服务器不会不断重新启动导致连接/断开连接。

标签: node.jsazuresocket.ioazure-web-app-servicehapi

解决方案


如果身份验证关闭,您的 WebSockets 是否工作?

当我启用身份验证功能时,我只会遇到使用 Linux 应用程序的 WebSockets 问题。

我认为这是由于 EasyAuth 代理的实施不善造成的,并且它被认为是 MS 难以解决的问题。


推荐阅读