【问题标题】:SignalR - sending parameter to OnConnected?SignalR - 向 OnConnected 发送参数?
【发布时间】:2021-11-23 19:55:54
【问题描述】:

我有以下 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 传递到集线器?

更新:

发送消息:

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

【问题讨论】:

    标签: signalr signalr-hub


    【解决方案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);
        }
    }
    

    在连接集线器后调用此方法。就可以更改通知类型而无需重新连接而言,它更加灵活。 (退订和订阅)

    替代方案

    如果您不想要额外的往返/灵活性。您可以在连接到集线器时发送 QueryString 参数。 Stackoverflow 回答:Signalr persistent connection with query params.

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

    在 OnConnected 中:

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

    【讨论】:

    • 我有点困惑 - 我使用字典来存储连接,而不是组。我将发布我的 SendMessage 方法。
    • 对不起,我是从我自己的代码中得到的。如果您将订阅的方法主体更改为 OnConnected 方法中的主体,它应该可以工作
    • 我还是有点困惑——那我不会覆盖 OnConnected 吗?这也需要另一个往返请求来启动,对吧?而且 - 我不担心重新连接 - ChatHub 用于专用页面,OtherHub 用于导航栏通知。用户在访问 Chat 时实际上将连接到两个集线器 - 我只是没有包括上面的内容。现已更正。想法?
    • 是的,它确实需要额外的往返。我找到了一个替代解决方案,它可能更符合您的需求。
    【解决方案2】:

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

    Asp .Net Framework 的代码示例:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多