2012-04-02 3 views
1

현재 서버 측에서 허브에 알리는 방법을 배웠습니다. 그런 다음 허브는 클라이언트에 알림을 브로드 캐스트합니다.hubcontext is null signalr

내 작업 내용은 페이스 북과 비슷한 친구 요청을 보내는 것을 기반으로합니다. X 씨가 Y 씨에게 요청을 보내는 경우, Y 씨에게만 알림 팝업이 표시됩니다.

따라서 그룹스와 협력하기로 결정했습니다. 한 그룹 - 한 명의 사용자를 생각하고 있습니다.

문제는 내가 노력한다는 것입니다 허브 시작에 내가 할 것이라고 :

$ .connection.hub.start (함수() {hub.login (XXX);});

여기서 XXX는 세션의 사용자 이름 또는 사용자 ID입니다. 나는 이것을 어떻게하는지 모른다.

그런 다음 username 또는 userID로 숨겨진 레이블을 만들고 page_load에 채우고 클라이언트 측에서 가져 오려고했습니다. 그러나 클라이언트 측은 서버 측보다 먼저 작동합니다.

그런 다음 허브 컨텍스트의 연결 ID를 사용하려고했습니다. 그러나 문제는 컨텍스트 및 그룹 관리자와 같은 거의 모든 것이 허브에서 null 인 것으로 보입니다. 허브 인스턴스를 사용하고 있기 때문입니까? 또는 정적 메서드가 있기 때문에?

 using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using SignalR.Hubs; 
using SignalR; 
using SignalR.Hosting.AspNet; 
using System.Web; 
using System.Web.SessionState; 

namespace DataLayer 
{ 
    public class NotificationHub: Hub 
    { 
     private static NotificationHub instance; 

     private NotificationHub() { } 

     public static NotificationHub Instance 
     { 
      get 
      { 
       if (instance == null) 
        instance = new NotificationHub(); 
       return instance; 
      } 
     } 

     public void NotifyClients(int gid, string value) 
     { 
      IConnectionManager connectionManager = (IConnectionManager)AspNetHost.DependencyResolver.GetService(typeof(IConnectionManager)); 
      dynamic clients = connectionManager.GetClients<NotificationHub>(); 
      clients[gid.ToString()].newNotification(value); 
      //let us then try to use connection id, but this.Context.ConnectionId is null 

     } 

     public void Login(string gid) 
     { 
      AddToGroup(gid); 
     } 

    } 
} 

는 내가하고 싶은 것이 몇 가지 다른 해결 방법이 될 수 있습니다 (I 다른 서버 측 코드에서 이러한 메서드를 호출하고 이후는/정적이 있거나 다른 인스턴스가해야하는)? (즉, 각 사람에게 고유 한 알림을 보내도록 하시겠습니까?)

+0

질문에 무엇이 잘못 되었습니까? – test

+0

질문을 던지거나 문맥을 알려주지 않았습니다. –

+0

@DrewMarsh 당신은 지금 더 좋다고 생각하니? – test

답변

4

허브에 대한 js 참조는 $.connection.notificationHub이 아니며 $.connection.hub이 아니어야합니다. 허브의 클래스 이름에서 가져온 것입니다. 원하는 경우 [HubName ("name")] 속성으로 이름을 바꿀 수 있습니다.

또한 SignalR은 허브의 수명주기를 관리합니다. 인스턴스를 작성할 필요가 없습니다. 나는 그 호출 당 하나의 싱글 톤인지를보기 위해 소스를 두 번 확인한다.

(만약 내가 정확하게 읽는다면) 어떤 식 으로든 친구의 연결 ID를 사용하는 것은 좋은 생각이 아니다. 현재로서는 보안이 유지되지 않아 사용자가 다른 사용자처럼 쉽게 가장 할 수 있습니다.

편집 : 팁이 하나 더 있습니다. 허브 안에서 클라이언트를 가져 오기 위해 ConnectionManager를 사용할 필요가 없습니다. Clients 속성을 사용할 수 있습니다. IE, 클라이언트 [gid.ToString()]. ​​newNotification (value);

+1

고맙습니다. 허브를 인스턴스화해야합니다. 당신은 그것을 부를 수 있습니다. 그런 다음 세션에서 userId를 가져 와서 허브의 로그인 메소드에 전달했습니다. 여기서 세션의 사용자 ID 그룹을 만듭니다. 또한 이것 때문에, IE와 크롬에서 같은 웹 사이트를 열려고한다면, 나는 다른 connectionID를 가지고 있었을 것이지만이 경우에는 같은 그룹을 사용할 것입니다. :) 이것은 잘 작동했습니다. 누구든지 문제가 생기면 기본 솔루션에 대해 저에게 연락하십시오. 친구 야 고마워 – test