2016-09-15 47 views
0

私はWebアプリケーションプロジェクトと角度2プロジェクトを持っています。 SignalRを使用してサーバーからメッセージを送信したいと思います。 それから私はこれを見つけました。それを実現することについてはarticleでした。 しかし、現在のユーザーにメッセージを送信する方法はわかりません。送信メッセージのC#のためのSignalR Web APIは現在のユーザにメッセージを送信します

コード:

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

しかし、送信され、このメッセージ:

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>(); 

と私の公開イベントを呼び出すを作成すべてのユーザーに通知します。この問題を修正し、現在のユーザーにメッセージを送信するためのコードを実装してください。

答えて

3

使用しているIHubContextオブジェクトには、複数のメソッドがあり、そのうちの1つはClientsで、タイプはIHubConnectionContextです。

そこでは、あなたがターゲットにしたいものを抽象GroupsGroupClients & Clientメソッドを持っています。使用して、あなたの場合は

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

が正常に動作しなければならないが(あなたはまだかかわらず、connectionIdを伝播する必要があります)。

N.B .: sendは、クライアント側で実装する必要があるJSメソッドです。

+0

あなたはContext.ConnectionIdを意味しますか?それとも他に何か? –

+0

typoが間違っています。あなたのconnectionIdでユーザを扱うには、 'Client'メソッドを使わなければなりません。 'User'は、[username](http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections)でユーザーに対処する場合に使用できます。 – bsoulier

関連する問題