Socket.IO房间不在Azure上工作,但在本地工作



我用socket.io和node.js做了一个简单的应用程序,它是一个推送通知服务。当用户连接到websocket时,发送他的用户名(和仪表板的名称),并立即加入以用户身份命名的房间。应用程序侦听POST请求,保存它们,然后向用户的房间发出消息。

io.on('connection', function(socket) {
socket.on('userid', function(data) { 
socket.join(data.userid+'-'+data.dashboard);
notification.find({userid: data.userid, to: data.dashboard, received_by_user: false}, function(err, notifs) {
socket.emit('get_notifications', notifs);
}
}
});
app.post('/notify', function(req, res, next) {
var notif_recv = new notification(req.body);
notif_recv.save(function (err, notif_recv) {
io.sockets.in(notif_recv.userid+'-'+notif_recv.dashboard).emit('new_notification', notif_recv);
});
res.send(200);
});

当我在本地用节点测试它时,它工作得很好,我向/notify发送了一个POST,我可以看到到达仪表板的通知。问题是,当我在Azure上的AppService上进行测试时,客户端连接到websocket并接收第一个通知(get_notifications事件),但当我从POST/notify时,客户端什么都没收到!(没有new_notification事件,io.sockets.in(...).emit(...)似乎在Azure上不起作用)。

出于调试目的,我使用console.log(…)在服务器上记录函数socket.join(...)io.sockets.in(...).emit(...)的返回值,结果io.socket.in(...).emit(...)似乎返回了一个没有任何通道和连接的io服务器!

IIS可能在搞砸它?我倾向于认为IIS对app.post('/notify'...io.on('connection'...有不同的进程,因此,我在app.post上引用的套接字与我在io.on('connection'..(socket.join(...))中加入用户不同。

在Azure/IIS中使用socket.io房间时有什么提示吗?谢谢

您是否尝试添加"断开连接"处理程序进行调试?

io.on('connection', function (socket) {
socket.on('disconnect', function(){ //add this part
console.log('Client disconnected');    
});
socket.emit('get_notifications', "get_notifications_:"+new Date());
});

还要在每次发送和接收时进行日志记录,这样您就可以准确地知道客户端何时断开连接。如果它在get_notifications事件后断开连接,请确保您没有向客户端发送回调,或者客户端没有期望来自服务器的回调。

我注意到notification.find(..)socket.on('userid'..)缺少一些大括号。我希望这只是你粘贴在这里的代码。

为了在Azure应用服务上测试socket.ioPOST问题,我简化了项目并在Azure上进行了测试。

测试server.js:

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
extended: true
})); 
server.listen(process.env.PORT ||3000, function(){
console.log('listening on *:3000');
});
app.get('/', function (req, res) {
res.sendfile(__dirname + '/client.html');
});
app.post('/notify', function(req, res, next) {
io.sockets.emit('new_notification', req.body);
res.send(200);
});
io.on('connection', function (socket) {
socket.emit('get_notifications', "get_notifications_:"+new Date());
});

客户端内容:

<body>
<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
var socket = io();
$.post("/notify",{
msg:"notification from client"
});
socket.on('get_notifications',function(msg){
console.log(msg);
});
socket.on('new_notification',function(msg){
console.log(msg);
});
</script>
</body>

这个简单的项目在Azure应用服务上运行良好。

因此,它可能是你申请的其他部分提出了你的问题。

您可以检查Diagnostics Logs或利用Visual Studio Team Services来解决该问题。请参阅如何在Azure应用程序服务上运行django manage.py命令的答案,了解如何在Azure App Services上启用团队服务扩展。

如有任何进一步的问题,请随时通知我。

最新更新