7

私が取り組んでいるプロジェクトの SignalR を見ていますが、まさに私が望んでいるようです。しかし、私がまだ少し困惑しているのは、グループと参加です。

最初に実装のコンテキストを説明しようと思います。したがって、既存のシステム内のユーザーは、特定のトピックについて会議を開催したいと考え、特定の名前/識別子でルームを作成し、他のユーザーをそこに招待すると、基本的にプライベート チャット ルームのようになります。

したがって、私が仮定する手順は、ホストとしてルームを作成して参加し、ユーザーがクリックする必要がある招待状を送信して、どのルームに参加するかをサーバーに伝えることです。

ドキュメントから、誰かをグループに入れるためにフックできる Join および Disconnect メソッドがあることがわかりましたが、 Join にはクエリ文字列以外のコンテキストが関連付けられていないように見えるので、少し混乱していますJoin をトリガーするものについては、何百もの個室がある可能性があるため、オブジェクトをどの部屋に配置するかに関するコンテキストを提供するオブジェクトを渡すクライアントで手動でトリガーされるメソッドになると予想されます。

では、Join メソッドにコンテキストを与え、切断メソッドにコンテキストを与えるにはどうすればよいでしょうか。そうすることで、手動でトリガーされていないかのように、参加を要求しているルームを彼らが知ることができます。クエリ文字列を設定するにはどうすればよいでしょうか。カスタム オブジェクトを送信しません。すなわち

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

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

それで、何かが足りないのでしょうか、それとも、参加しているユーザーにコンテキストを提供して、最初に適切な場所に配置する方法はありますか?

4

1 に答える 1

8

私はあなたとほとんど同じ経験をしており、それを通して自分の道を進んだり戦ったりしたので、私がやったことを共有します.

どこかで状態をキャプチャする必要があります。クライアントからサーバーへのラウンドトリップの SignalR Hubs wiki https://github.com/SignalR/SignalR/wiki/Hubsを確認してください。サーバーハブまたはクライアントで状態を設定し、反対側でそれを取得する方法を教えてくれるので、これは便利だと思いました.

Join は何らかのイベントによって手動でトリガーされるというあなたと同じ結論に達しました。投票を使用して、誰かがユーザーとのチャットを要求したかどうかを確認しています。実際にはサーバーからプッシュできます ( 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[]>グループ名については、Singleton を使用して、 ( 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;
}

少なくとも漠然と役立つことを願っています!

于 2012-08-22T18:31:17.903 に答える