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。
那里有 Groups
、Group
、Clients
和 Client
方法,它们抽象了您想要的目标。
在你的情况下使用:
_context.Clients.Client(connectionId).send(message);
应该可以正常工作(尽管您仍然需要传播 connectionId)。
N.B.: send
是一个JS方法,应该在客户端实现。
我有网络应用程序项目和一个 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。
那里有 Groups
、Group
、Clients
和 Client
方法,它们抽象了您想要的目标。
在你的情况下使用:
_context.Clients.Client(connectionId).send(message);
应该可以正常工作(尽管您仍然需要传播 connectionId)。
N.B.: send
是一个JS方法,应该在客户端实现。