2016-04-27 144 views
1

我正在构建一个相当简单的单页应用程序。它基本上是一个项目列表,其中每个项目都有一些细节,活动日志和当前状态以及一些按钮,以触发服务器上的操作以沿着工作流程推进状态。用SignalR替换REST端点的缺点?

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

为了解决这个问题,我研究了很好的SignalR。但我有一个问题。

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

我正在研究过滤重复id客户端,或发送连接id与POST,然后广播到除请求者之外的所有客户端,但它似乎有点不必要地复杂。

相反,我只是这样做。

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响应代码的周围丢失一些常见的语义错误处理,但我不认为这是一个巨大的交易情况。

+0

简单的解决方案删除_When添加一个项目(使用POST)回调添加请求客户端上的项目。这很好._只需用signalr添加项目。 –

回答

1

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

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

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

+0

如果我抛弃了我已经完成的REST,那么这就行得通了:)但是,除非我像前面提到的那样沿着id发送它,否则它不适用于我的原始场景。听到纯粹的SignalR方法应该可以工作是一件好事。我可能会避开Clients.Others,因为我不想更新调用方,直到服务器验证请求。 –

+0

我想象你有一个项目数组保存在你本地存储客户端。为什么不在你的客户端进行ifExits检查,因此你的item已经有了跟踪记录。 –