2013-02-10 23 views
1

我正在用SignalR进行我的第一次测试。我正在玩聊天消息,但这只是将我今天在我的网站上从客户端到服务器的所有轮询都取代的第一步。SignalR群组未被调用

我有很多场景,我想通过他们的登录或他们的ID通知某些用户。我的想法是,只要他连接,我就将每个用户添加到两个组中。我在OnConnected中执行此操作,并调用该事件。

当我发送聊天消息时,我有两种模式:公共或个人模式。如果是私人的,发件人会收到通知,收件人应该被通知。发件人收到一条消息,但该组从来没有。发现一个组有多少个成员似乎是不可能的。

任何想法这里有什么问题吗?

public class GlobalHub:Hub 
{ 
    private Users user; 

    private void AuthenticateUser() 
    { 
     var ydc = new MyDataContext(); 
     user = ydc.Users.First(u => u.Login == HttpContext.Current.User.Identity.Name); 
    } 

    public override Task OnConnected() 
    { 
     var ydc = new MyDataContext(); 
     user = ydc.Users.First(u => u.Login == HttpContext.Current.User.Identity.Name); 

     Groups.Add(Context.ConnectionId, user.Login); 
     Groups.Add(Context.ConnectionId, user.ID.ToString()); 
     return base.OnConnected(); 
    } 


public void SendChatMessage(string message, string recipient) 
{ 
    AuthenticateUser(); 
    var cm = ChatController.AddChatMessage(user.Login, user.ID, recipient, tmessage); 

    if (recipient != "") 
    { 
     Clients.Caller.NewMessage(cm); 
     Clients.Group(recipient).NewMessage(cm); 
    } 
    else 
    { 
     Clients.All.NewMessage(cm); 
    } 
} 
} 
+0

您的Hub代码看起来不错。我会验证SendChatMessage是否被正确的收件人调用。接收者也应该是user.Login或user.ID.ToString()? – 2013-02-11 04:34:35

+0

收件人是登录。但它应该以任何方式工作,因为我有两个组中的每个用户:)但是,如果代码看起来很好为什么NewMessage呼叫All和呼叫者,但不是为组?有什么方法可以调试谁在哪个组? – Sparhawk 2013-02-11 19:40:29

+0

组是与.All和.Caller作品分开的。您需要确保它试图将您的用户添加到相应的组。至于能够调试并找出谁在哪个组中:除非您包含SiganlR源代码并逐步完成源代码,否则您将无法进行调试。 – 2013-02-11 22:18:45

回答

1

它看起来像Groups.Add不会立即加入到该组的连接,而是返回一个需要启动的任务。尝试返回Groups.Add的结果作为OnConnectedMethod的结果。

另请参见更详细的解释:https://stackoverflow.com/a/15469038/174638