Signalr: Хотите сохранить чат на сервере sql, но не поддерживаете

Созданный на 31 дек. 2012  ·  7Комментарии  ·  Источник: SignalR/SignalR

Привет, Дэвид,

Я создал приложение для чата с использованием signalR, как чат в facebook. Теперь я хочу сохранить данные чата в базе данных и отобразить эту историю для соответствующей комнаты чата. Не могли бы вы подсказать, как это заархивировать? SignalR поддерживает связь с сервером sql?
Также не могли бы вы подсказать, как я могу поддерживать идентификатор соединения, чтобы я мог повторно инициализировать чат после обратной передачи, как приложение чата facebook.

Question

Самый полезный комментарий

Прежде всего, если вам нужна помощь, просто скажите, что вам нужна помощь. Вы чего-то не знаете, это не значит, что SignalR не поддерживает это или это проблема.

  • Поскольку вы говорили что-то вроде чата FB, я предположил, что у вас уже есть управление состоянием входа в систему (идентификатор пользователя в сеансе или cookie или что-то еще).
  • Предлагаю вам использовать HUB.
  • После того, как пользователь вошел в систему и активирует чат, вы запускаете соединение с HUB и получаете идентификатор соединения SignalR.
  • Поскольку у вас уже есть идентификатор подключенного пользователя, сохраните сопоставление идентификатора подключения и идентификатора пользователя SignalR. (например: структура таблицы: user_id, conn_id, updated_date).
  • когда вы получили сообщение чата от идентификатора соединения, вы можете легко узнать, от какого пользователя оно пришло.
  • Затем сохраните журнал чата, используя ИД пользователя, и получите журнал, используя ИД пользователя.

Ключевым моментом является то, что вас не волнует идентификатор соединения. Вы должны сопоставить его с вашим собственным непротиворечивым уникальным ключом. Опять же, я бы посоветовал не поддерживать conn id. Лучше быть случайным. Если необходимо поддерживать идентификатор подключения, вы можете перезаписать генератор идентификатора подключения по умолчанию.

Все 7 Комментарий

Прежде всего, если вам нужна помощь, просто скажите, что вам нужна помощь. Вы чего-то не знаете, это не значит, что SignalR не поддерживает это или это проблема.

  • Поскольку вы говорили что-то вроде чата FB, я предположил, что у вас уже есть управление состоянием входа в систему (идентификатор пользователя в сеансе или cookie или что-то еще).
  • Предлагаю вам использовать HUB.
  • После того, как пользователь вошел в систему и активирует чат, вы запускаете соединение с HUB и получаете идентификатор соединения SignalR.
  • Поскольку у вас уже есть идентификатор подключенного пользователя, сохраните сопоставление идентификатора подключения и идентификатора пользователя SignalR. (например: структура таблицы: user_id, conn_id, updated_date).
  • когда вы получили сообщение чата от идентификатора соединения, вы можете легко узнать, от какого пользователя оно пришло.
  • Затем сохраните журнал чата, используя ИД пользователя, и получите журнал, используя ИД пользователя.

Ключевым моментом является то, что вас не волнует идентификатор соединения. Вы должны сопоставить его с вашим собственным непротиворечивым уникальным ключом. Опять же, я бы посоветовал не поддерживать conn id. Лучше быть случайным. Если необходимо поддерживать идентификатор подключения, вы можете перезаписать генератор идентификатора подключения по умолчанию.

Привет ZeroHackeR,

Спасибо за ответ. Означает ли это, что мы можем передать собственный идентификатор подключения? и мы сможем продолжить чат после того, как отправим ответ? Я имею в виду, после переназначения всех деталей для конкретной комнаты он продолжит чат ??

  • Я имел в виду, что как только пользователь вошел в систему, у вас будет его / ее идентификатор пользователя, верно?
  • Итак, вы сохраняете идентификатор пользователя в переменной сеанса. Например: на странице входа в приложение после аутентификации пользователя сохраните его идентификатор пользователя в сеансе. Например: сеанс ["userid"] = "123";
  • Затем, как только пользователь подключится к чату, SignalR сгенерирует идентификатор подключения. Вы также можете сохранить отображение идентификатора conn id и идентификатора пользователя в БД (необязательно, но это будет полезно для проверки и интеллектуального анализа данных. Для простоты я не буду здесь об этом говорить)

Вот примеры методов чат-сервера:

`` С #
публичное переопределение System.Threading.Tasks.Task OnConnected ()
{
// Получаем UserID. Предполагается, что пользователь вошел в систему перед подключением к чату, а идентификатор пользователя сохранен в сеансе.
строка UserID = (строка) HttpContext.Current.Session ["идентификатор пользователя"];

      // Get ChatHistory and call the client function. See below
      this.GetHistory(UserID); 

      // Get ConnID
      string ConnID =  Context.ConnectionId; 

      // Save them in DB. You got to create a DB class to handle this. (Optional)
      DB.UpdateConnID(UserID, ConnID); 
}

private void GetHistory(UserID)
{
      // Get Chat History from DB. You got to create a DB class to handle this.
      string History = DB.GetChatHistory(UserID); 

      // Send Chat History to Client. You got to create chatHistory handler in Client side.
      Clients.Caller.chatHistory(History );           
}

 // This method is to be called by Client 
public void Chat(string Message)
{
      // Get UserID. Assumed the user is logged before connecting to chat and userid is saved in session.
     string UserID = (string)HttpContext.Current.Session["userid"]; 

     // Save Chat in DB. You got to create a DB class to handle this
     DB.SaveChat(UserID, Message); 

     // Send Chat Message to All connected Clients. You got to create chatMessage handler in Client side.
     Clients.All.chatMessage(Message);  
}

`` ''

ПРИМЕЧАНИЕ: Я только что записал здесь. Еще не тестировал.

Привет ZeroHackeR,

Еще раз большое спасибо, у вас есть примерный пример? Я не ожидаю, что он будет работать на 100%, я просто хочу для справки.
Огромное спасибо

Можем ли мы перенести это в StackOverflow? Это не проблема в SignalR, и в SO от этого будет больше пользы, чем здесь.

@niravpatel Я написал 3 метода именно для вас. Зачем просить большего? Если вы не знаете, как сохранять в БД, вам лучше пойти в библиотеку и найти книги по C #. Вы должны сначала попробовать, основываясь на них, прежде чем спрашивать. На этом мы закончим нашу тему.

@raybooysen Полностью согласен.

Закрытие

Была ли эта страница полезной?
0 / 5 - 0 рейтинги