2016-09-15 3 views
0

웹 애플리케이션 프로젝트와 앵귤러 2 프로젝트가 있습니다. SignalR을 사용하여 서버에서 메시지를 보내고 싶습니다. 그럼 구현에 대해서는 article입니다. 하지만 현재 사용자에게 메시지를 보내는 방법을 모르겠습니다. 메시지 보내기 C 번호SignalR Web API가 현재 사용자에게 메시지를 보냅니다.

코드 :

public class EventHub : Hub 
    { 
     public async Task Subscribe(string channel) 
     { 
      await Groups.Add(Context.ConnectionId, channel); 

      var @event = new ChannelEvent 
      { 
       Name = $"{Context.ConnectionId} subscribed", 
       Data = new 
       { 
        Context.ConnectionId, 
        ChannelName = channel 
       } 
      }; 

      await Publish(@event); 
     } 

     public async Task Unsubscribe(string channel) 
     { 
      await Groups.Remove(Context.ConnectionId, channel); 

      var @event = new ChannelEvent 
      { 
       Name = $"{Context.ConnectionId} unsubscribed", 
       Data = new 
       { 
        Context.ConnectionId, 
        ChannelName = channel 
       } 
      }; 

      await Publish(@event); 
     } 

     public Task Publish(ChannelEvent channelEvent) 
     { 
      Clients.Caller.OnEvent(Constants.AdminChannel, channelEvent); 

      return Task.FromResult(0); 
     } 

     public override Task OnConnected() 
     { 
      var @event = new ChannelEvent 
      { 
       Name = $"{Context.ConnectionId} connected", 
       Data = new 
       { 
        Context.ConnectionId, 
       } 
      }; 

      Publish(@event); 

      return base.OnConnected(); 
     } 

     public override Task OnDisconnected(bool stopCalled) 
     { 
      var @event = new ChannelEvent 
      { 
       Name = $"{Context.ConnectionId} disconnected", 
       Data = new 
       { 
        Context.ConnectionId, 
       } 
      }; 

      Publish(@event); 

      return base.OnDisconnected(stopCalled); 
     } 
    } 

public static class Constants 
    { 
     public const string AdminChannel = "admin"; 
     public const string TaskChannel = "tasks"; 
    } 

public class ChannelEvent 
    { 
     public string Name { get; set; } 

     public string ChannelName { get; set; } 

     public DateTimeOffset Timestamp { get; set; } 

     public object Data 
     { 
      get { return _data; } 
      set 
      { 
       _data = value; 
       Json = JsonConvert.SerializeObject(_data); 
      } 
     } 
     private object _data; 

     public string Json { get; private set; } 

     public ChannelEvent() 
     { 
      Timestamp = DateTimeOffset.Now; 
     } 
    } 

그런 다음 내 컨트롤러에서 나는 내 게시 IhubContent

private readonly IHubContext _context = GlobalHost.ConnectionManager.GetHubContext<EventHub>(); 

를 작성하고 호출 이벤트 :

private void PublishEvent(string eventName, StatusModel status) 
{ 
    _context.Clients.Group(Constants.TaskChannel).OnEvent(Constants.TaskChannel, new ChannelEvent 
    { 
     ChannelName = Constants.TaskChannel, 
     Name = eventName, 
     Data = status 
    }); 
} 

그러나 전송이 메시지 모든 사용자에게. 이 문제를 해결하고 현재 사용자에게 메시지를 보내도록 코드를 구현하도록 도와주세요.

답변

3

사용중인 IHubContext 개체에는 Clients 중 하나 인 IHubConnectionContext 인 여러 메서드가 있습니다.

거기에서 당신은 당신이 목표로 원하는 추상적 인 Groups, Group, Clients & Client 방법이있다. 사용하여 경우

:

_context.Clients.Client(connectionId).send(message); 

가 제대로 작동되어야한다 (당신은 여전히 ​​비록 connectionId을 전파해야합니다).

N.B .: send은 클라이언트 쪽에서 구현해야하는 JS 방법입니다.

+0

userId 당신은 Context.ConnectionId를 의미합니까? 아니면 다른 사람? –

+0

typo가 잘못되었으므로 connectionId를 사용하여 사용자를 처리하려면 'Client' 메소드를 사용해야합니다. '사용자'는 사용자 이름 ([username]) (http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections)을 사용하여 주소를 지정하는 경우 사용할 수 있습니다. – bsoulier

관련 문제