1

SignalRを使用してC#ベースのWebアプリケーションを作成しています。これまでのところ、「ロビー」エリア(オープンなコミュニケーションが許可されている)と「セッション」エリア(5人のグループがプライベートな会話を行うことができ、サーバーの相互作用はグループにのみ表示されます)があります。

私がやりたいのは、メモリ内に「ロギング」オブジェクトを作成することです。セッションごとに1つです(したがって、5人のグループが3つある場合、ロギングオブジェクトは3つになります)。

'session'領域はHubs(およびIDisconnect)を継承し、いくつかのメソッド(Join、Send、Disconnectなど)があります。メソッドは、クライアント側のJS関数を呼び出すJavaScriptクライアントにデータを返します。コンストラクターメソッドを使用してみました:

public class Session : Hub, IDisconnect
{
    public class Logger
    {
        public List<Tuple<string, string, DateTime>> Log;

        public List<Tuple<string, string, DateTime>> AddEvent(string evt, string msg, DateTime time)
        {
            if (Log == null)
            {
                Log = new List<Tuple<string, string, DateTime>>();
            }
            Log.Add(new Tuple<string, string, DateTime>(evt, msg, time));

            return Log;
        }

    }

    public Logger eventLog = new Logger();

    public Session()
    {
        eventLog = new Logger();
        eventLog.AddEvent("LOGGER INITIALIZED", "Logging started", DateTime.Now);
    }

    public Task Join(string group)
    {
        eventLog.AddEvent("CONNECT", "User connect", DateTime.Now);
        return Groups.Add(Context.ConnectionId, group);
    }

    public Task Send(string group, string message)
    {
        eventLog.AddEvent("CHAT", "Message Sent", DateTime.Now);
        return Clients[group].addMessage(message);
    }

    public Task Interact(string group, string payload)
    {
        // deserialise the data
        // pass the data to the worker
        // broadcast the interaction to everyone in the group

        eventLog.AddEvent("INTERACTION", "User interacted", DateTime.Now);
        return Clients[group].interactionMade(payload);
    }

    public Task Disconnect()
    {
        // grab someone from the lobby?
        eventLog.AddEvent("DISCONNECT","User disconnect",DateTime.Now);
        return Clients.leave(Context.ConnectionId);
    }
}

ただし、これにより、ユーザーがサーバーと対話するたびにロガーが再作成されます。

新しいセッションごとに1つのロガーを作成し、それに要素を追加する方法を知っている人はいますか?または、これを行うためのより簡単な方法があり、私は問題を考えすぎていますか?

4

1 に答える 1

6

ハブは常に作成され、廃棄されます。(静的でない限り)持続すると予想されるデータをデータに入れないでください。

ロガーオブジェクトは独自のクラス(Hub / IDisconnectを拡張しない)であるため、作成することをお勧めします。
これができたら、SignalRグループ(セッションを表すためにこれらを使用)をロガーにマップする静的ConcurrentDictionaryをハブに作成します。

ハブで「参加」メソッドをトリガーすると、接続が含まれているグループを検索するのと同じくらい簡単です=>ログデータをグループロガーに送信します。

SignalRを介して「部屋」やその他の種類のグループを作成する場合は、https://github.com/davidfowl/JabbRを確認してください。

お役に立てれば!

于 2012-10-11T16:48:55.467 に答える