2013-02-10 27 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