SignalR Web API 向当前用户发送消息

SignalR Web API send message to current user

我有网络应用程序项目和一个 angular 2 项目。 我想使用 SignalR 从服务器发送消息。 然后我发现这个 article 关于实现它。 但是我不知道怎么给当前用户发消息

发送消息的代码 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
    });
}

但是这条消息发送给了所有用户。帮助我解决此问题并实现代码以向当前用户发送消息。

您正在使用的 IHubContext 对象有多个方法,其中之一是 Clients,类型为 IHubConnectionContext

那里有 GroupsGroupClientsClient 方法,它们抽象了您想要的目标。

在你的情况下使用:

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

应该可以正常工作(尽管您仍然需要传播 connectionId)。

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