Регистрация событий сервера в signalR

Я пишу веб-приложение на C#, используя SignalR. На данный момент у меня есть зона «лобби» (где разрешено открытое общение) и зона «сеанса» (где группы из 5 человек могут вести приватный разговор, а любые взаимодействия с сервером видны только группе).

Что я хотел бы сделать, так это создать в памяти объект «логирования» - по одному для каждого сеанса (так что, если есть три группы по пять человек, у меня будет три объекта логирования).

Область «сессия» наследуется от HubsIDisconnect) и имеет несколько методов (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 воссоздается каждый раз, когда пользователь взаимодействует с сервером.

Кто-нибудь знает, как я смогу создать один Logger для каждого нового сеанса и добавить к нему элементы? Или есть более простой способ сделать это, и я просто слишком много думаю о проблеме?


person MassivePenguin    schedule 11.10.2012    source источник


Ответы (1)


Хабы постоянно создаются и утилизируются! Никогда не помещайте в них данные, которые вы ожидаете сохранить (если только они не статичны).

Я бы порекомендовал создать объект логгера как собственный класс (не расширяя Hub/IDisconnect).
После этого создайте статический ConcurrentDictionary в хабе, который сопоставляет группы SignalR (используйте их для представления ваших сеансов) с логгерами.

Когда у вас есть метод «Присоединиться», активированный на вашем концентраторе, это просто, как поиск группы, в которой было соединение => Отправка данных журнала в регистратор групп.

Проверьте https://github.com/davidfowl/JabbR, когда дело доходит до создания "комнат" и других видов групп через SignalR

Надеюсь это поможет!

person N. Taylor Mullen    schedule 11.10.2012
comment
Спасибо за это - имеет смысл, теперь я смотрю на это. Я относительно новичок в C #, поэтому полезно изучить тонкости :) - person MassivePenguin; 12.10.2012
comment
Теперь в SignalR есть постоянный тип подключения для сохранения данных или концентратора. - person Khanh Nguyen; 20.12.2016