【发布时间】:2020-05-08 17:59:46
【问题描述】:
我正在尝试在 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。
不确定这是否相关......
EDIT2:
当我尝试从我的客户端连接时
const socketIo = io(socketUrl + "/chat", {
// transports: ["websocket"]
upgrade: false,
})
一切正常。但如果我取消注释transports: ["websocket"],连接将失败。一定和 Azure 中的 websocket 设置有关
【问题讨论】:
-
您是否在监听应用服务名称:
var socket = io('http://<your app name>.azurewebsites.net');? -
请尝试禁用 IIS WebSockets 支持模块 (iiswsock.dll),因为 node.js 不需要它。请参阅:azure.microsoft.com/en-in/blog/…(假设应用已部署到 Windows WebApp)
-
感谢您的快速回复。 GauraKumar,它已被部署到 Linux Web App。它正在运行节点 12. 4c7436b41,我尝试连接 'http://
.azurewebsites.net' 以及我自己的自定义域。没有任何工作:( -
感谢链接 4c74356b41。我尝试了他们在我的 express 应用程序中完全处理 CORS 的解决方案,但这也不起作用。另一种解决方案是在 Azure 应用服务中使用基于 Windows 的环境,但我无法选择该选项,因为 Node.js 不支持它。除非我运行一个我目前不想做的 docker 容器
标签: node.js azure websocket socket.io azure-web-app-service