我正在使用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,并为其添加元素?或者有一种更简单的方法可以做到这一点而我只是在思考这个问题?
集线器一直在创建和处理!永远不要将数据放在预期的数据中(除非它是静态的).
我建议创建你的logger对象,因为它是自己的类(不是扩展Hub/IDisconnect).
一旦你有了在集线器上创建一个静态ConcurrentDictionary,它将SignalR组(使用这些代表你的会话)映射到记录器.
如果在集线器上触发了"加入"方法,则可以轻松查找连接所在的组=>将日志记录数据发送到组记录器.
结帐https://github.com/davidfowl/JabbR,通过SignalR制作"房间"和其他种类的分组
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
2047 次 |
| 最近记录: |