我正在尝试向群组发送消息,但我无法让它发挥作用。我将用户添加到组但是不发送消息,但使用Clients.All有效。这是我的设置。
调用Javascript连接到集线器,它获取组中的用户并将其作为聊天室中的用户返回,然后将joinRoom发送到服务器,以便我可以将用户添加到组并从中发送消息服务器向客户说明他们已加入。
Javascript To Connect
$.connection.hub.start()
.done(function () {
chatHub.server.getConnectedUsers("MyChat") //return user list
.done(function (connectedUsers) {
ko.utils.arrayForEach(connectedUsers, function (item) {
users.contacts.push(new chatR.user(item.Username));
});
}).done(function () {
chatHub.server.joinRoom("MyChat", "My Room")
.done()
.fail(function(){ alert('failed to join group')}); //join the group
});
});
服务器端JoinRoom
public async Task JoinRoom(string room, string displayName)
{
// context variables
var name = Context.User.Identity.Name;
var connectionId = Context.ConnectionId;
// new group
var group = new SignalGroup(room, displayName, SignalGroupType.Chatroom);
// adding relation to storage
_manager.AddGroup(name, group); <-- adds to database
// anouncing the room was joined
Clients.Group(room).joinedRoom(name); //<-- This does not work
//Clients.All.joinedRoom(name); <-- This works
//Clients.OthersInGroup(room).joinedRoom(name);
// add group to SignalR
await Groups.Add(room, connectionId); // <-- why does this have to be last? when I move this before the _manager.AddGroup it never sends the client message?
}
因此Clients.Group(room).joinedRoom(name)
不起作用,我没有收到任何错误消息,客户端也从未收到消息。这是客户端功能。
客户端JoinedRoom
chatHub.client.joinedRoom = function (name) {
var connectedUser = new chatR.user(name);
users.contacts.push(connectedUser);
chat.messages.push(new chatR.chatMessage("System", name + " joined.", new Date()));
};
对于“奖励”,这里是我的SendChatMessage
方法,当我发送给所有人但不发送给小组时,该方法也有效。
public void SendChatMessage(string room, string message)
{
// context variables
var name = Context.User.Identity.Name;
var user = _manager.GetUser(name);
if (user.IsInGroup(room))
{
// tells clients to addChatMessage
//Clients.All.addChatMessage(name, message, DateTime.Now);
Clients.Group(room).addChatMessage(name, message, DateTime.Now);
}
}
所以我的主要问题是,为什么我无法发送给小组?我明确地将它们添加到组中并向该组发送消息?
第二个问题是,为什么JoinRoom方法必须最后添加到组调用,或者它似乎根本不用于All?
如果你有任何有用的链接,这些东西也会很棒,我已经阅读了所有的MS文档和一些教程,让我更加困惑的是为什么这不起作用。
编辑:我在joinRoom调用中添加了一个失败的检查,看看我是否得到了任何回复,看起来好像SignalR无法加入群组本身。我不知道如何解决这个问题。
答案 0 :(得分:1)
您的参数顺序错误。它应该是
Groups.Add(connectionId, room);
此外,如果要以相同方法为该用户使用该组,则需要先将用户添加到该组并等待该呼叫。否则,没有必要等待。