使用SignalR替换REST端点的任何缺点?

时间:2016-04-27 06:08:35

标签: c# rest signalr

我正在构建一个相当简单的单页应用。它基本上是一个项目列表,其中每个项目都有一些细节,活动日志和当前状态,以及一些按钮,用于触发服务器上的操作以提升工作流程中的状态。

它最初是使用MVC和REST / Web API编写的,但我遇到了使并发用户保持最新的问题。例如,如果用户A添加了一个项目,我们希望用户B的屏幕上的列表现在更新为包含它。

为了解决这个问题,我调查了SignalR,它很有效。但我有一个问题。

  • 添加项目(使用POST)时,回调会在请求客户端上添加项目。这很好。
  • 然后,我在服务器上触发了一个SignalR广播,告诉所有客户有关新项目的信息。除了当地的客户,现在有2个项目,这个工作正常。

我正在考虑过滤重复的id客户端,或者使用POST发送连接ID,然后向请求者以外的所有客户端广播,但似乎有点不必要的复杂。

相反,我只是这样做。

public class UpdateHub : Hub
{
    public void AddNewItem(NewItem item)
    {
        // and some server-side stuff, persist in the data store, etc
        item.trackingID = new Guid();
        item.addLogEntry("new item");
        // ...
        dataStore.addItem(item);

        // send message type and data payload
        Clients.All.broadcastMessage("add", item);
    }
}

完全摆脱所有REST的东西似乎要简单得多,所以我错过了什么重要的东西吗?

它会在一个使用IE11 +的少数用户的内联网上运行,我想我们确实失去了一些常见的语义来围绕HTTP响应代码进行错误处理,但我并不认为这样做。在这种情况下,这是一笔巨大的交易。

1 个答案:

答案 0 :(得分:1)

为了解决重复问题,您可以尝试在Hub类中使用Clients.Others,如果不在Hub类中,则使用AllExcept(id)。

     Clients.Others.broadcastMessage("add", item);

在你使用SignalR的情况下,不应该有任何缺点。