1

我正在使用SignalR编写基于 C# 的 Web 应用程序。到目前为止,我有一个“大厅”区域(允许公开交流)和一个“会话”区域(5 人一组可以进行私人对话,并且任何服务器交互只显示给该组)。

我想做的是在内存中创建一个“日志记录”对象——每个会话一个(所以如果有三组,每组五个人,我会有三个日志记录对象)。

“会话”区域继承自Hubs(and 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);
    }
}

但这会导致每次用户与服务器交互时都会重新创建 Logger。

有谁知道我如何能够为每个新会话创建一个 Logger 并向其中添加元素?还是有更简单的方法可以做到这一点,而我只是想多了这个问题?

4

1 回答 1

6

集线器一直在创建和处置!永远不要将您希望持续的数据放入其中(除非它是静态的)。

我建议将您的记录器对象创建为它自己的类(不扩展 Hub/IDisconnect)。
一旦你在集线器上创建了一个静态 ConcurrentDictionary ,它将 SignalR 组(使用这些来表示你的会话)映射到记录器。

当您在集线器上触发“加入”方法时,查找连接所在的组很容易 => 将日志记录数据发送到组记录器。

在通过 SignalR 制作“房间”和其他类型的分组时,请查看https://github.com/davidfowl/JabbR

希望这可以帮助!

于 2012-10-11T16:48:55.467 回答