2016-09-15 53 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

相關問題