2013-12-21 44 views
12

我有以下JS工作:SignalR - 将参数发送到OnConnected?

var chat = $.connection.appHub; 

我的应用程序有一个单一的枢纽,AppHub,即处理两种类型的通知 - ChatOther。我正在使用一个集线器,因为我需要随时访问所有连接。

我需要能够告诉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()); 
     } 
    } 

回答

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

在集线器连接后调用此方法。它更灵活,因此可以在不必重新连接的情况下更改通知类型。 (退订和订阅)

替代

如果你不想额外往返/灵活性。连接到集线器时可以发送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

对不起,我从我自己的代码中拿到了。它应该工作,如果你改变你的OnConnected方法中的订阅的方法体 –

+0

我还是有点困惑 - 我不会重写OnConnected吗?这也需要另一个往返请求来启动,对吗?而且 - 我不担心重新连接 - ChatHub用于专用页面,OtherHub用于导航栏通知。当访问聊天时,用户实际上将连接到两个集线器 - 我只是没有包括上述内容。现在更正。思考? – RobVious