在signalR中记录服务器事件

Mas*_*uin 1 c# signalr

我正在使用SignalR编写基于C#的Web应用程序.到目前为止,我有一个"大厅"区域(允许开放式通信)和"会话"区域(5人组可以进行私人对话,任何服务器交互仅显示给组).

我想要做的是在内存中创建一个"日志记录"对象 - 每个会话一个(所以如果有三个五人组,我将有三个日志对象).

'session'区域继承自Hubs(和IDisconnect),并有几种方法(Join,Send,Disconnect等).这些方法将数据传递回JavaScript客户端,后者调用客户端JS函数.我尝试过使用构造函数方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

有谁知道我如何能够为每个新会话创建一个Logger,并为其添加元素?或者有一种更简单的方法可以做到这一点而我只是在思考这个问题?

N. *_*len 5

集线器一直在创建和处理!永远不要将数据放在预期的数据中(除非它是静态的).

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

如果在集线器上触发了"加入"方法,则可以轻松查找连接所在的组=>将日志记录数据发送到组记录器.

结帐https://github.com/davidfowl/JabbR,通过SignalR制作"房间"和其他种类的分组

希望这可以帮助!