2016-09-15 149 views
0

我有Web应用项目和一个角度2项目。 我想用SignalR从服务器发送消息。 然后我发现这个article实施它。 但我不知道如何发送消息给当前用户。SignalR Web API向当前用户发送消息

代码发送消息C#:

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

在有你有你要定位的抽象的东西GroupsGroupClients & Client方法。

在你的情况下使用:

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

应该工作正常(你仍然需要传播的ConnectionId虽然)。

N.B .: send是应该在客户端实现的JS方法。

+0

userId你的意思是Context.ConnectionId?还是其他的? –

+0

错误的拼写错误,您必须使用'Client'方法来用其connectionId来访问用户;用户名可以用于用户名[用户名](http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections) – bsoulier

相关问题