2013-12-21 86 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