SignalR集线器中的上下文为空

问题描述:

我有一个Web窗体应用程序并进行测试,以了解SignalR如何满足我的一项要求。我的枢纽代码: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> 

但是,出于某种原因,检查的背景下,当在服务器代码(集线器),它是空的,所以我不能检索查询字符串值。有任何想法吗?

我不相信在创建Hub时可以使用上下文。相反,你可以在你的HUB类覆盖OnConnection

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

    return base.OnConnected(); 
} 

Google文档Hub Object Lifetime

你不要实例集线器类或从服务器上自己 代码调用它的方法;所有这些都是由SignalR Hubs 管道为您完成的。 SignalR在每次需要处理集线器操作时都会创建Hub类的新实例,例如客户端连接,断开连接或向服务器发起方法调用。

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

+0

notificationsHub.server.setValue(12345);在客户端,这给了我一个错误。 'notificationsHub'未定义 – WinFXGuy

+0

您已将您的hub命名为'notificationHub'而不是'notificationsHub',这可能是原因。我已经更新了我的答案,您可以如何*检索查询字符串值。 –

+0

你是对的。在退出OnConnected时,上下文将为空。我能够在覆盖中检索查询字符串值。 – WinFXGuy