【问题标题】:How to pass a parameter to hub in SignalR?如何将参数传递给 SignalR 中的集线器?
【发布时间】:2014-03-04 21:14:48
【问题描述】:

我在 SignalR hub 中的代码:

public class AlertHub : Hub
{
    public static readonly System.Timers.Timer _Timer = new System.Timers.Timer();

    static AlertHub()
    {
        _Timer.Interval = 60000;
        _Timer.Elapsed += TimerElapsed;
        _Timer.Start();
    }

    static void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        //Random rnd = new Random();
        //int i = rnd.Next(0,2);
        Alert alert = new Alert();
        i = alert.CheckForNewAlerts(EmpId);

        var hub = GlobalHost.ConnectionManager.GetHubContext("AlertHub");

        hub.Clients.All.Alert(i);
    }
}

不知何故,我需要传递 EmpId 参数。如何做到这一点?

更多客户详情: 在我的 aspx 页面上,我有以下代码:

<script type="text/javascript">

    $(function () {
        var alert = $.connection.alertHub;
        alert.client.Alert = function (msg) {
            if (msg == 1) {
                $("#HyperLink1").show();
                $("#HyperLink2").hide();

            }
            else {
                $("#HyperLink1").hide();
                $("#HyperLink2").show();
            }
            //$("#logUl").append("<li>" + msg + "</li>");
        };
        $.connection.hub.start();
    });

</script>

在 ASPX 页面上,我的 EmpID 位于会话对象中,我需要以某种方式在 SignalR 集线器中使用它。

【问题讨论】:

  • EmpId 来自哪里?
  • 这是我需要通过的,但我不知道如何以及在哪里做。
  • 我不确定我是否遵循。该属性是什么意思,即使您知道如何传递它,您在哪里可以访问它?它可以从其他地方暴露出来吗?您将无法在构造函数中传递任何内容,因为您不负责创建 Hub。您希望集线器拥有的任何内容要么需要已经知道,要么从其他地方提取。
  • 我为你更新了答案

标签: c# signalr signalr-hub


【解决方案1】:

除了接受的答案之外,我还使用它将多个查询字符串从客户端传递到集线器: 在客户端:

Dictionary<string, string> queryString = new Dictionary<string, string>();
        queryString.Add("key1", "value1");
        queryString.Add("key2", "value2");
        hubConnection = new HubConnection("http://localhost:49493/signalr/hubs", queryString);

---其余代码--------

在 Hub 类中:

public override Task OnConnected()
{
 var value1 = Convert.ToString(Context.QueryString["key1"]);
 var value2 = Convert.ToString(Context.QueryString["key2"]);
 return base.OnConnected();
}

我在使用 c# 的 Windows 窗体应用程序中使用版本“2.3.0.0”的“Microsoft.AspNet.SignalR.Client”库。

【讨论】:

    【解决方案2】:

    您可以通过连接(例如check herehere)来跟踪连接的用户(以及任何相关的元数据),并根据您的需要检查您存储的本地数据。

    signalR 本身不会传递任何东西。客户必须传递东西。

    如果您的客户有员工 ID,请让它在连接时将其发送到信号器中心。您可以添加一个处理程序,知道客户端何时在您的 aspx 页面 javascript 中连接,然后将其发送到集线器。然后,集线器可以在字典中跟踪ConnectionId, EmployeeID,您可以使用它来访问特定客户端或做任何您想做的事情。

    查看我发布的链接,它们显示了如何执行此操作。

    【讨论】:

    • 我应该在客户端连接上发送 EmpId 吗?这就是我连接到客户端集线器的方式。 var alert = $.connection.alertHub;请告诉我如何在客户端连接时添加处理程序。
    • @WinFXGuy,@halter73 的链接向您展示了如何在将调用回调的 start() 方法上注册一个函数。那时只需将您想要的任何内容发送到集线器即可。
    • 谢谢大家。我的另一个 SO 问题解决了这个问题。 stackoverflow.com/questions/22206192/…
    • @devshorts 如果我按照您的建议在字典中保留与我的用户关联的连接 ID,如果用户刷新页面,我如何重新打开该连接。有没有办法在特定的连接 ID 上调用 $.connection.hub.start()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2019-05-01
    • 2023-01-30
    • 2011-02-18
    相关资源
    最近更新 更多