2014-03-05 4 views
2

Web Forms 어플리케이션을 보유하고 있으며, SignalR이 내 요구 사항 중 하나에서 작동하는 방식을 테스트하고 있습니다. 내 허브 코드 :SignalR 허브에서 컨텍스트가 null입니다.

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> 

(허브) 서버 코드의 컨텍스트를 조사하지만, 어떤 이유로, 그것은 null의 경우, 그래서 나는를 검색 할 수 없습니다 쿼리 문자열 값. 어떤 아이디어?

답변

5

허브가 만들어진 지점에서 컨텍스트를 사용할 수 있다고 생각하지 않습니다. Hub Object Lifetime

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

    return base.OnConnected(); 
} 

문서 : 대신 당신은 당신의 허브 클래스에 OnConnection을 무시할 수

당신은 허브 클래스의 인스턴스 또는 서버에 자신의 코드에서 메서드를 호출하지 않습니다; SignalR Hubs 파이프 라인에 의해 완료됩니다. SignalR은 클라이언트가 연결될 때, 연결이 끊어 지거나 서버에 대한 메소드 호출과 같은 허브 작업을 처리 할 때마다 때마다 Hub 클래스의 새 인스턴스를 생성합니다.

Hub 클래스의 인스턴스가 일시적이므로 을 사용하여 한 메서드 호출에서 다음 상태 호출로 상태를 유지 관리 할 수 ​​없습니다. 서버가 클라이언트로부터 메서드 호출을받을 때마다 Hub 클래스의 새 인스턴스가 메시지를 처리합니다. 여러 개의 연결 및 메서드 호출을 통해 상태를 유지하려면 데이터베이스 또는 Hub 클래스의 정적 변수 또는 허브에서 파생되지 않은 다른 클래스 과 같은 다른 메서드를 사용하십시오. Hub 클래스의 static 변수와 같은 메서드를 사용하여 메모리에 데이터를 유지하면 응용 프로그램 도메인이 재생 될 때 데이터가 손실됩니다.

+0

notificationsHub.server.setValue (12345); 클라이언트에서이 오류가 발생합니다. 'notificationsHub'가 정의되지 않았습니다. – WinFXGuy

+0

당신은 아마도'notificationsHub'가 아닌'notificationHub' 허브를 호출했습니다. querystring 값을 검색 할 수있는 방법으로 내 대답을 업데이트했습니다. –

+0

정확합니다. 컨텍스트는 OnConnected를 종료 할 때까지 null이됩니다. 재정의에서 쿼리 문자열 값을 검색 할 수있었습니다. – WinFXGuy

관련 문제