【问题标题】:Context is null in SignalR hubSignalR 集线器中的上下文为空
【发布时间】:2014-03-05 18:30:11
【问题描述】:

我有一个 Web 窗体应用程序和测试,以了解 SignalR 如何满足我的一项要求。我的中心代码:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;

namespace SignalRTest.Hubs
{
    public class NotificationHub : Hub
    {
        public static readonly System.Timers.Timer _Timer = new System.Timers.Timer();


        public NotificationHub()
        {
            var myInfo = Context.QueryString["myInfo"];

            _Timer.Interval = 2000;
            _Timer.Elapsed += TimerElapsed;
            _Timer.Start();
        }

        void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            Random rnd = new Random();
            int i = rnd.Next(0, 2);
            var hub = GlobalHost.ConnectionManager.GetHubContext("NotificationHub");
            hub.Clients.All.Alert(i);
        }
    }
}

我的客户电话:

<script type="text/javascript">
    $(function () {
        var logger = $.connection.notificationHub;
        logger.client.Alert = function (msg) {
            if (msg == 1) {
                $("#HyperLink1").show();
                $("#HyperLink2").hide();

            }
            else {
                $("#HyperLink1").hide();
                $("#HyperLink2").show();
            }
        };

        $.connection.hub.qs = "myInfo=12345";
        $.connection.hub.start();
    });
</script>

但是,由于某种原因,当检查服务器代码(在集线器中)上的上下文时,它为空,所以我无法检索查询字符串值。有什么想法吗?

【问题讨论】:

    标签: c# signalr signalr-hub signalr.client


    【解决方案1】:

    我认为在创建 Hub 时上下文不可用。相反,您可以在 Hub 类上覆盖 OnConnection

    public override Task OnConnected()
    {
        var myInfo = Context.QueryString["myInfo"];
    
        return base.OnConnected();
    }
    

    Hub Object Lifetime 上的文档:

    您不会实例化 Hub 类或从您自己的方法调用其方法 服务器上的代码; SignalR 集线器为您完成的所有工作 管道。 SignalR 每次都会创建一个新的 Hub 类实例 它需要处理集线器操作,例如客户端连接时, 断开连接,或对服务器进行方法调用。

    因为 Hub 类的实例是瞬态的,所以不能使用它们 保持从一个方法调用到下一个方法调用的状态。每次 服务器接收来自客户端的方法调用,您的新实例 Hub 类处理消息。通过多个保持状态 连接和方法调用,使用其他一些方法,例如 数据库,或 Hub 类上的静态变量,或不同的类 不是从 Hub 派生的。如果您将数据持久保存在内存中,请使用 Hub 类上的静态变量等方法,数据将是 应用域回收时丢失。

    【讨论】:

    • notificationsHub.server.setValue(12345);在客户端,这给了我一个错误。 'notificationsHub' 未定义
    • 您已将您的集线器称为notificationHub 而不是notificationsHub,这可能就是原因。我已经用你如何可以检索查询字符串值更新了我的答案。
    • 你是对的。 Context 在退出 OnConnected 时将为空。我能够在覆盖中检索查询字符串值。
    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2022-08-09
    • 2017-09-12
    相关资源
    最近更新 更多