0

我正在尝试在 Azure 应用服务上使用我的 Node.js 服务器设置 socket.io。它在我的本地服务器上运行良好。但是,我似乎无法让它在 Azure 上运行。

我在 Azure 应用服务 -> 配置 -> 常规设置中启用了 Web 套接字。但是,这不起作用。

我已按照此 stackoverflow 帖子中的说明进行操作:Socket IO net::ERR_CONNECTION_REFUSED但它对我不起作用。

我的服务器端代码:

...
const port = process.env.PORT || 5000;
const app: Application = express();
const server = require("http").Server(app);
const io = require("socket.io")(server);
...
io.of("/chat").on("connection", async function(socket: any) {
  console.log('hi')
});
...
server.listen(port, () => console.log(`listening on port ${port} `));

我的 CORS 设置也已正确设置,对我的服务器的 HTTP 请求工作正常,以及需要凭据的请求。

任何帮助,将不胜感激。谢谢

编辑(更多信息):

我正在使用内部身份验证。因此,我需要将标题“Access-Control-Allow-Credentials”设置为 TRUE。我的 express 应用程序通过 cors npm 模块将其设置为 true,但是无论我做什么,在执行身份验证请求时我都无法让 HTTP 请求工作。

我能够通过这样做来解决这个问题:

az resource update --name web --resource-group <myResourceGroupName> --namespace Microsoft.Web --resource-type config --parent sites/<site-name> --set properties.cors.supportCredentials=“true” --api-version 2015-06-01

我在这里找到的:(https://docs.microsoft.com/bs-latn-ba/azure/app-service/app-service-web-tutorial-rest-api

这允许带有凭据的 HTTP 请求以及任何其他 HTTP 请求工作。需要注意的是,在我的 Azure 设置中,我的所有 CORS 设置仍然为空白,以便让我的 express 应用程序处理 CORS。

不确定这是否相关...

编辑2:

当我尝试从我的客户端连接时

    const socketIo = io(socketUrl + "/chat", {
      // transports: ["websocket"]
      upgrade: false,
    })

一切正常。但如果我取消注释transports: ["websocket"],连接将失败。它必须与 Azure 中的 websocket 设置有关

4

2 回答 2

1

我建议您提供一个最小的工作示例(服务器和客户端页面),它可以简化事情。

这里有几件事要检查:

  • perMessageDeflate在您的服务器端 Node.js 代码中禁用

例如像这样:

const io = require('socket.io')(server,{
   perMessageDeflate :false
});
  • Azure Web Apps 仅侦听端口 80 和 443,这是一个常见问题

它看起来不像这里的案例,但它经常发生,所以我将它留在这里以帮助其他人。根据文档

问:我可以在我的自定义容器镜像上暴露多个端口吗?

A:我们不支持暴露多个端口。因此,如果是这种情况 - 将端口更改为其中任何一个,您的应用程序就可以正常工作。

我希望它有帮助!

于 2020-02-04T02:06:28.397 回答
-1

所以我做了一个准系统例子来测试套接字连接......它工作了。

然后,我再次尝试了我的应用程序......并且它有效。不知道发生了什么,但现在一切正常......

于 2020-02-05T15:31:14.623 回答