2014-04-27 70 views
0

我想向组发送消息,我无法使其工作。我将用户添加到组中,但不会发送消息,尽管使用Clients.All可行。这是我的设置。无法发送到SignalR组

Javascript调用连接到集线器,它获取组中的用户并将其作为聊天室中的用户返回,然后向服务器发送一个连接室,以便我可以将用户添加到该组中,并将消息从服务器给客户说明他们已经加入。

Javascript功能来连接

$.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方法必须有添加到组呼最后还是它似乎它不与所有的工作都什?

如果您有这东西,这将是伟大的,以及任何有用的链接,我看了所有的MS文档和几个教程这让我连上这是为什么不工作更加困惑。

编辑:我在joinRoom调用中添加了一个失败检查,看看我是否收回任何东西,看起来好像SignalR无法加入组本身。我不知道我会如何解决这个问题。

回答

1

你得到了错误的参数顺序。它应该是

Groups.Add(connectionId, room); 

另外,如果你想使用组此用户在相同的方法,需要用户首先添加到组,并等待呼叫。否则,没有必要等待。

+0

Doh,今晚我会回家看看这个。我希望就是这样,很有道理。谢谢:) – Tony

+0

是的,我一定已经想通了,因为我现在在我的代码中已经这样了。偷偷摸摸地交换了params哈哈。谢谢!! – Tony