使用发布 - 订阅模式使用SignalR向客户端发送更新

时间:2014-04-16 10:47:26

标签: c# asp.net asp.net-web-api signalr publish-subscribe

我有一些需要实时显示给用户的信息。在我重复调用服务器以获取新数据之前。

现在我想用SignalR替换这些重复的调用。一般的想法是在客户端上订阅中心,当新的条目被添加到数据库时,它将向所有客户端发送更新,但是我坚持使用该结构的一般设计。

所以我有我的WebAPI项目和服务层。在添加新条目的服务中,我将引发一个事件,并在内部集中捕获该事件并向所有客户端发送更新。

使用SignalR实现这些事情是否正确?有人可以解释一下我是如何实现的,因为我使用的是asp.net WebAPI和SimpleInjector。

2 个答案:

答案 0 :(得分:2)

带有signalR的PubSub模式可以使用组本地实现。使用组名作为主题,用户可以通过加入\离开组来订阅\取消订阅。

以下是代码段。它是直截了当的,它应该可以很好地扩展。

[HubName("PubSub")]
public class PubSubHub : Hub {
    public void Publish(string topic, object data) {
        Clients.Group(topic).onNewMsg(topic, data);
    }
    public async Task Subscribe(string topic) {
        await Groups.Add(Context.ConnectionId, topic);
        Clients.Client(Context.ConnectionId).onSubscribed(topic);
    }

    public async Task Unsubscribe(string topic) {
        await Groups.Remove(Context.ConnectionId, topic);
        Clients.Client(Context.ConnectionId).onUnsubscribed(topic);
    }
}

答案 1 :(得分:1)

围绕SignalR设计pub / sub有很多方法

我为SignalR创建了一个包装器,以事件聚合形式解决它

请参阅维基

https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki

使用nuget安装

Install-Package SignalR.EventAggregatorProxy 

查看演示项目 https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/tree/master/SignalR.EventAggregatorProxy.Demo.MVC4