SignalR - отправка параметра OnConnected?
У меня работает JS:
var chat = $.connection.appHub;
В моем приложении есть один концентратор AppHub
, который обрабатывает два типа уведомлений - Chat
и Other
. Я использую один концентратор, потому что мне нужен доступ ко всем соединениям в любое время.
Мне нужно указать OnConnected
, который напечатает его через следующее:
[Authorize]
public class AppHub : Hub {
private readonly static ConnectionMapping<string> _chatConnections =
new ConnectionMapping<string>();
private readonly static ConnectionMapping<string> _navbarConnections =
new ConnectionMapping<string>();
public override Task OnConnected(bool isChat) { // here
string user = Context.User.Identity.Name;
if (isChat){
_chatConnections.Add(user, Context.ConnectionId);
_navbarConnections.Add(user, Context.ConnectionId);
} else{
_navbarConnections.Add(user, Context.ConnectionId);
}
}
}
Использование в идеале должно быть примерно таким:
var chat = $.connection.appHub(true);
Как передать этот параметр в концентратор из javascript?
Обновление:
SendMessage:
// will have another for OtherMessage
public void SendChatMessage(string who, ChatMessageViewModel message) {
message.HtmlContent = _compiler.Transform(message.HtmlContent);
foreach (var connectionId in _chatConnections.GetConnections(who)) {
Clients.Client(connectionId).addChatMessage(JsonConvert.SerializeObject(message).SanitizeData());
}
}
Ответы
Ответ 1
Я бы предпочел добавить метод к концентратору, который вы вызываете от клиента, чтобы подписаться на этот тип. Например.
public void Subscribe(bool isChat) {
string user = Context.User.Identity.Name;
if (isChat){
_chatConnections.Add(user, Context.ConnectionId);
} else{
_otherConnections.Add(user, Context.ConnectionId);
}
}
Вы вызываете этот метод после подключения концентратора. Это более гибко в том смысле, что тогда можно изменить тип уведомления без повторного подключения. (Отменить подписку и Подписаться)
Alternative
Если вам не нужен дополнительный кругооборот/гибкость. Вы можете отправлять параметры QueryString при подключении к концентратору. Stackoverflow answer: Постоянное соединение Signalr с параметрами запроса.
$.connection.hub.qs = 'isChat=true';
И в OnConnected:
var isChat = bool.Parse(Context.QueryString["isChat"]);