2012-10-11 41 views
1

我正在使用SignalR編寫基於C#的Web應用程序。到目前爲止,我有一個「大廳」區域(允許開放通信)和一個「會話」區域(5人可以進行私人對話,任何服務器交互只顯示給該羣組)。在信號中記錄服務器事件R

我想要做的是在內存中創建一個「日誌記錄」對象 - 每個會話一個(所以如果有三個五人組,我會有三個日誌記錄對象)。

的 '會話' 區域從Hubs(和IDisconnect)繼承,並且有幾種方法(加入,發送,斷開等)。這些方法將數據傳回給調用客戶端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); 
    } 
} 

但是這會導致每次用戶與服務器交互時都會重新創建記錄器。

有誰知道我會怎樣才能創建一個記錄每個新的會話,並添加到它的元素?還是有更簡單的方法來做到這一點,我只是在解決問題?

回答

4

集線器被創建和處置!永遠不要將數據放在你期望的數據中(除非它是靜態的)。

我建議創建你的記錄器對象,因爲它是自己的類(不擴展Hub/IDisconnect)。
一旦你在集線器上創建一個靜態ConcurrentDictionary,它將SignalR組(將它們用來表示你的會話)映射到記錄器。

當您在集線器上觸發了「加入」方法時,查找連接所在的組很容易=>將記錄數據發送到組記錄器。

結帳https://github.com/davidfowl/JabbR當談到通過SignalR

希望這有助於使「房」和其他類型的分組!

+0

非常感謝 - 現在我看完了。我對C#相對來說比較陌生,所以最好學習更精細的點:) – MassivePenguin

+0

SignalR中現在有一個持久連接類型來保存數據或集線器。 –