SignalR hub中的Context为null

时间:2014-03-05 18:30:11

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

我有一个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>

但是,由于某种原因,当检查服务器代码上的Context(在hub中)时,它为null,因此我无法检索查询字符串值。有什么想法吗?

1 个答案:

答案 0 :(得分:6)

我不相信在创建Hub时可以使用Context。相反,您可以在Hub类上覆盖OnConnection

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

    return base.OnConnected();
}

Hub Object Lifetime上的文档:

  

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

     

由于Hub类的实例是瞬态的,因此您无法使用它们   保持状态从一个方法调用到下一个。每一次   服务器接收来自客户端的方法调用,一个新的实例   Hub类处理消息。通过多重维持状态   连接和方法调用,使用一些其他方法,如a   数据库,或Hub类上的静态变量,或其他类   这不是来自Hub。如果您将数据保留在内存中,请使用   方法如Hub类上的静态变量,数据将是   应用程序域回收时丢失。