我正在尝试在 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 设置有关