SignalR - 将参数发送到OnConnected?

时间:2013-12-21 23:08:25

标签: signalr signalr-hub

我有以下JS工作:

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

2 个答案:

答案 0 :(得分:24)

我宁愿为您从客户端调用以订阅该类型的集线器添加一个方法。 E.g。

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"]);

答案 1 :(得分:0)

Hallvar 的回答在更多情况下很有用。但有时您也可以使用标头将数据发送到 OnConnected 方法。

Asp .Net 框架的代码示例:

var myParameter = HttpContext.Current.Request.Headers["HeaderName"];

对于 .NET 5+,您可能需要依赖注入来访问 HttpContext,如图所示here