C# 在信号器中记录服务器事件

C# 在信号器中记录服务器事件,c#,signalr,C#,Signalr,我正在使用编写一个基于C的web应用程序。到目前为止,我有一个允许公开交流的“大厅”区域,还有一个“会话”区域,5人小组可以在其中进行私人对话,任何服务器交互都只向小组显示 我想做的是在内存中创建一个“logging”对象——每个会话一个,所以如果有三组五个人,我就有三个logging对象 “会话”区域继承自集线器和IDisconnect,并具有多个方法Join、Send、Disconnect等。。这些方法将数据传递回JavaScript客户端,后者调用客户端JS函数。我尝试过使用构造函数方法:

我正在使用编写一个基于C的web应用程序。到目前为止,我有一个允许公开交流的“大厅”区域,还有一个“会话”区域,5人小组可以在其中进行私人对话,任何服务器交互都只向小组显示

我想做的是在内存中创建一个“logging”对象——每个会话一个,所以如果有三组五个人,我就有三个logging对象

“会话”区域继承自集线器和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);
    }
}
但这会导致每次用户与服务器交互时都重新创建记录器


有人知道我如何能够为每个新会话创建一个记录器,并向其中添加元素吗?还是有更简单的方法来解决这个问题,而我只是想得太多了?

集线器一直都在创建和处理!除非数据是静态的,否则永远不要在它们中放入你期望能持续的数据

我建议您创建logger对象,因为它是自己的类,不扩展Hub/IDisconnect。 一旦您有了这个功能,就在中心上创建一个静态ConcurrentDictionary,它映射信号器组,并使用它们向记录器表示您的会话

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

当涉及到通过信号器制作房间和其他类型的分组时,结帐


希望这有帮助

集线器始终被创建和处理!除非数据是静态的,否则永远不要在它们中放入你期望能持续的数据

我建议您创建logger对象,因为它是自己的类,不扩展Hub/IDisconnect。 一旦您有了这个功能,就在中心上创建一个静态ConcurrentDictionary,它映射信号器组,并使用它们向记录器表示您的会话

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

当涉及到通过信号器制作房间和其他类型的分组时,结帐


希望这有帮助

谢谢你,这很有道理,现在我来看看。我对C相对来说比较陌生,所以学习更精细的方面是很好的:现在在Signal中有一个持久连接类型来持久化数据或集线器。感谢这一点-非常有意义,现在我来看看它。我对C相对来说比较陌生,因此了解更精细的方面是很好的:现在在SignalR中有一个持久连接类型来持久化数据或集线器。