2016-04-27 145 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已經有了跟蹤記錄。 –