2012-05-18 37 views
7

我在看SignalR一個項目我的工作,這似乎是我想要的東西。然而,我仍然有點困惑的是團隊和加入。SignalR和加入羣

我會嘗試首先描述的執行環境。因此,現有系統中的用戶想要召開關於給定主題的會議,然後創建具有給定名稱/標識符的會議室,然後他們將邀請其他會員進入會議室,然後基本上像私人聊天室一樣。

所以我假設的步驟將是爲主機,創建一個房間,並加入它,然後發出邀請,這將要求用戶點擊它會以某種方式告訴服務器哪個房間加入到。

現在我從文檔中看到有一個Join和Disconnect方法,您可以將某人放入組中,但似乎Join沒有與查詢字符串關聯的上下文,所以我有點糊塗,什麼觸發加入,因爲我希望這將是在經過一些對象,提供上下文來把他們在哪個房間,因爲你可能有數百個包房客戶端上的手動觸發方法。

那麼你如何給Join方法一些上下文,並斷開連接,這樣他們就知道你要加入的是哪個空間,就好像它不是手動觸發的那樣你如何設置查詢字符串,如果它是手動觸發爲什麼你不能發送一個自定義對象。即

public Task Join() 
{ 
    var groupName = Context.QueryString["some-room-identifier"]; 
    return Groups.Add(Context.ConnectionId, groupName); 
} 

VS

public Task Join(string groupName) 
{ 
    return Groups.Add(Context.ConnectionId, groupName); 
} 

所以我思念的東西或者是有一些方法給上下文的連接用戶可以把他們在正確的地方第一次?

回答

8

我和你有過很多相同的經歷,並且有過與我一樣的工作/戰鬥,所以我會分享我所做的。

你需要的地方捕捉的狀態。查看從客戶端到服務器的往返傳輸下的SignalR Hubs wiki https://github.com/SignalR/SignalR/wiki/Hubs。我發現它很有用,因爲它告訴你如何在服務器集線器或客戶端上設置狀態,並在另一端檢索它。

我來到了相同的結論,你的是,加入手動某些事件觸發。 我正在使用民意調查來查看是否有人向用戶請求過聊天。 實際上,你可以從服務器(見SignalR Join Group From Controller)推,這意味着,處理添加一個新的聊天消息的控制器動作可以調用樞紐的Join方法:

// join chatroom 
public Task Join(dynamic mygroup) 
{ 
var groupName = groupy.GetGroupName(parent.userId, (int)mygroup.userIdTo); 
return Groups.Add(Context.ConnectionId, groupName); 
} 

對於我的組名稱,我使用單例生成並使用Dictionary<string, int[]>int[]用於userIds)跟蹤名稱。

對於客戶端狀態的東西,我結束了一個自定義的JavaScript對象管理組名,像這樣...

Chat.Chatgroup = function (groupId, userIdTo) { 
this.GroupId = groupId; // our group's title/id 
this.UserIdTo = userIdTo; // who the other user is 
} 

然後我稱之爲signalR方法連接

onechat.getOurGroup(mygroup) // invoke method on server 
.done(function (response) { 
mygroup = response; 
/* + whatever else you need to do*/ }); 

現在你可以在服務器上設置的狀態和保持客戶機上的狀態後:

public dynamic GetOurGroup(dynamic mygroup) 
{ 
var ourId = groupy.GetGroupName(parent.userId, (int)mygroup.UserIdTo); 
mygroup.GroupId = ourId;      
return mygroup; 
} 

希望它至少依稀有用!

+0

感謝所有有用的東西,我不會把它當作現在的答案,但會給你一個有用的投票。希望隨着時間的推移,更多的人會鍾情於此。 – Grofit

+0

是的,這是新東西,因爲我們知道我們會改進 – testpattern

+0

+1。我認爲這是唯一的方法,因爲SignalR不提供返回給定連接ID的組名的API。 – GETah