2013-12-21 6 views
12

У меня есть следующий JS работы:SignalR - отправка параметра OnConnected?

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?

Update:

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

ответ

22

Я предпочел бы добавить метод к концентратору, который вы называете от клиента, чтобы подписаться на тип. Например.

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 ответить: Signalr persistent connection with query params.

$.connection.hub.qs = 'isChat=true'; 

И в OnConnected:

var isChat = bool.Parse(Context.QueryString["isChat"]); 
+0

Я немного запутался - я использую Словари для хранения соединений, а не группы. Я отправлю свой метод SendMessage. – RobVious

+0

Извините, я взял это из своего собственного кода. Он должен работать, если вы измените тело метода Subscribe с помощью метода OnConnected –

+0

. Я все еще немного смущен - не мог бы я вообще переопределить OnConnected? Для этого также потребуется другой запрос на поездку туда и обратно, не так ли? И - меня не интересуют пересоединения - ChatHub предназначен для выделенной страницы, а OtherHub - для уведомлений navbar. Пользователь фактически подключается к обоим концентраторам при посещении чата - я просто не включил это выше. Исправлено сейчас. Мысли? – RobVious

Смежные вопросы