2012-05-18 41 views
7

私が働いているプロジェクトのためSignalRで探しています、そして私がしたい正確に何のようです。しかし、まだ私が少し戸惑っているのは、グループと参加です。SignalRと参加グループ

私は、最初の実装の状況を説明しようとします。したがって、既存のシステム内のユーザーは、特定のトピックについての会議を開催したいと思って、指定された名前/識別子の部屋を作成し、次に他のユーザーを招待し、基本的にプライベートチャットルームのようになります。

だから私は仮定の手順は、ホストとしても部屋を作成し、それに参加し、その後、何とか部屋がに参加するサーバーを教えてくれますどのクリックするようユーザーを必要とする招待状を送信します。

ここで、ドキュメントから、誰かをグループに入れるために引っ掛けることのできる結合と切断の方法がありますが、結合にはクエリ文字列以外のコンテキストが関連付けられていないようです私はあなたがプライベートルームの数百を持っている可能性があるのでどのような部屋に、それらを配置するよう、それは文脈を与えるいくつかのオブジェクト上を通過するクライアントの手動でトリガ方法だろう期待通り、参加をトリガーするものにと少し混乱しています。

どのようにJoinメソッドに何らかのコンテキストを与え、接続を解除すると、手動でトリガーされていないかのように、参加を要求しているルームがわかるので、クエリ文字列を設定する方法手動でトリガされた理由は、カスタムオブジェクトを送信できません。すなわち

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

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

は、だから私は何かが欠けていたり、適切な場所は初めてでそれらを置くために参加するユーザーにコンテキストを与えるためにいくつかの方法がありますか?

答えて

8

私はあなたと同じ経験をしていて、自分のやり方で仕事をしているので、自分のやり方を分かち合います。

あなたはどこかの状態をキャプチャする必要があります。 SignalR Hubs wiki https://github.com/SignalR/SignalR/wiki/Hubsをクライアントからサーバーへのラウンドトリップでチェックしてください。サーバーのハブまたはクライアントで状態を設定し、もう一方の端でそれを取得する方法を説明するので、便利なことがわかりました。

私は参加を手動でいくつかのイベントによってトリガされていることを、あなたと同じ結論に来ました。 誰かがチャットをリクエストしたかどうかを確認するために、ポーリングを使用しています。私は生成にシングルトンを使用して、私のグループ名について

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

あなたは実際に新しいチャットメッセージを追加処理するコントローラのアクションは、ハブのJoinメソッドを呼び出すことができることを意味し、(SignalR Join Group From Controllerを参照)、サーバーからプッシュすることができますDictionary<string, int[]>(ユーザーIDの場合はint[])を使用して名前を追跡します。

クライアント状態のものについては、このようにグループ名を管理するカスタムJavaScriptオブジェクトを作成しました。

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

その後、私は今、あなたは、サーバー上の状態を設定し、クライアントにその状態を保持することができます

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

を接続した後signalRメソッドを呼び出します。

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

関連する問題