Я работаю над добавлением функции чата SignalR в существующее приложение (что означает, что я не могу изменить архитектуру приложения), и столкнулся с проблемой при подключении к моей базе данных, чтобы обрабатывать управление группами / сохранение / историю сообщений . Часть самой строки подключения создается, когда пользователь входит в приложение, форматируется и сохраняется как переменная сеанса. Формат следующий: "ServerName\\InstanceName"
.
Очевидно, Сессия недоступна из концентраторов SignalR , и поскольку концентратор создается до того, как пользователь входит в систему, я не могу передать значение в его конструктор из моего класса Startup.
Для справки, вот часть моего класса-концентратора, показывающая, как я передаю в репозиторий через конструктор. При обычном использовании приложение берет строку подключения из сеанса и передает ее вызову .ConnectToInstance()
, который у меня также есть в конструкторе. Я установил DependencyResolver в своем классе запуска для обработки внедрения репозитория.
public class ChatHub : Hub
{
private static readonly ConnectionMap<string> _connections = new ConnectionMap<string>();
private readonly IChatRepository _chatRepository;
public ChatHub(IChatRepository repository)
{
_chatRepository = repository;
// _chatRepository.ConnectToInstance(CONNECTION_STRING_HERE)
}
public void JoinGroup(string groupName)
{
var group = _chatRepository.GetChatGroup(groupName);
var chatUser = _chatRepository.GetChatUser(Context.User.Identity.Name);
if (group == null)
{
var newGroup = new ChatGroup
{
RoomName = groupName
};
_chatRepository.CreateChatGroup(group);
if (chatUser != null)
{
_chatRepository.AddUserToGroup(chatUser, newGroup);
Groups.Add(Context.ConnectionId, groupName);
}
}
else
{
_chatRepository.AddUserToGroup(chatUser, group);
Groups.Add(Context.ConnectionId, groupName);
}
}
... Other methods below ...
}
В настоящее время решение, которое я пытаюсь сделать, кажется довольно неправильным - я пытаюсь установить для переменных сеанса 1030 * переменных в моем .cshtml
файле, фрагмент ниже.
<script>
var activeConnection = '@Session["ActiveConnection"]');
</script>
Затем я пытаюсь передать это значение через строку запроса концентратора в переопределение метода OnConnected()
в моем концентраторе сигналов. . Там я бы позвонил .ConnectToInstance()
, используя эту строку подключения, и это настроило бы репозиторий и позволило бы мне подключиться к базе данных.
$(document).ready(function () {
$.connection.hub.qs = { 'activeConnection': activeConnection };
...
Other Code
...
$.connection.hub.start().done(function () {
// TODO: Pass correct group
chatHub.server.joinGroup("primaryGroup");
});
}
Это почти работает, однако Javascript удаляет двойной backsla sh в соединении (см. Формат в первом абзаце). Это, конечно, делает строку подключения недействительной. Я также не могу динамически добавить \\
обратно, поскольку имена серверов и экземпляров, используемые для его создания, похоже, не соответствуют каким-либо конкретным соглашениям. Опять же, я не могу это изменить.
Есть ли лучший способ справиться с этим, чем передача строки подключения через Javascript? Если нет, как мне предотвратить удаление JS \\
в строке подключения? Для справки, одна backsla sh удаляется, когда я впервые устанавливаю эту переменную activeConnection
, а вторая удаляется, когда я передаю ее в строку запроса хаба. Я пробовал использовать String.raw()
, но это не сработало.