【问题标题】:sending updates to clients with SignalR using publish-subscribe pattern使用发布-订阅模式使用 SignalR 向客户端发送更新
【发布时间】:2014-04-16 10:47:25
【问题描述】:

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

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

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

使用 SignalR 实现这些事情的方法是否正确?鉴于我正在使用 asp.net WebAPI 和 SimpleInjector,有人可以解释我如何实现它。

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 简短回答:您可以将 SignalR 用于实时更新所需的任何内容。另外,在询问 SOCan somebody explain how I can implement that ... 之前,请先研究 SignalR 以及如何实现/使用它
  • @NewAmbition 你仔细阅读我的问题了吗?我说“我坚持使用该结构的一般设计”,但不是使用 SignalR。我发现的一些示例与我的情况无关。
  • 你能粘贴一些代码让人们知道你的情况吗?

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


【解决方案1】:

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

这里是代码 sn-ps。它是直截了当的,应该可以很好地扩展。

[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);
    }
}

【讨论】:

    【解决方案2】:

    围绕 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

    【讨论】:

    • 谢谢,那个库看起来很整洁,但是我如何为事件脚本指定路径,例如具有“/api/eventAggregation/events”
    • 发现可以使用:Bootstrapper.Init(); MapExtensions.Map(_app, "/api/eventAggregation/events", subApp => AppBuilderUseExtensions.Use>(subApp, new object[0]));而不是 _app.MapEventProxy();
    • 两者是否在同一个应用域中?您的 IEventAggregator 实现需要能够选择 evsnt。我的示例仅适用于同一应用程序域的内存
    • 您有一个服务器端侦听器将事件转发到我的库吗?检查 wiki 中的每个步骤,看看是否缺少步骤
    • 您需要实现 SignalR.EventAggregatorProxy.EventAggregation.IEventAggregator 并将其注册到 SignalR。检查接口的订阅方法是否触发。如果确实如此,那部分就可以了。您现在应该能够使用发送到 subscribe 方法的 Action 委托将事件发布到 SignalR
    猜你喜欢
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多