Подтвердить что ты не робот

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());
        }
    }
4b9b3361

Ответ 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"]);