Home >> Blog >> 什麼是 SignalR
什麼是 SignalR
我們非常清楚客戶端如何將資料發送到伺服器,所以現在該了解伺服器如何通過 HTTP 連接將資料推送到客戶端。SignalR 是一個開源庫,用於在 ASP.Net Web 應用程式中添加實時 Web 功能。那麼實時功能是什麼意思呢?僅當超過 1 個用戶在 Google Documents 中處理同一個文檔時作為示例當用戶進行更改並且同時另一個用戶可以在不重新加載頁面的情況下看到更改時。因此,實時 Web 功能是讓伺服器程式碼將內容推送到連接的客戶端的能力。在 HTTP 請求響應模型中,我們知道每次需要發送新請求以與伺服器通信,但 SignalR 提供客戶端和伺服器之間的持久連接。
它可以通過 SQL Server、Redis 或服務總線輕鬆橫向擴展(橫向擴展意味著添加更多伺服器來處理負載)。無需擔心這個橫向擴展術語,在我的下一篇文章中我將詳細解釋它,因為 SignalR 提供了良好的橫向擴展功能。SignalR 使用 Web 套接字技術發送資料。WebSocket 是一種新的 HTML5 API,它支持瀏覽器和伺服器之間的雙向通信,但如果它不可用,那麼 SignalR 可以使用其他技術,如長輪詢。
SignalR 以非壓縮 JSON 文本或純文本格式傳輸資料,因此如果您想以壓縮 JSON 格式發送資料,則需要在伺服器端編寫自己的邏輯,並在客戶端編寫相同的邏輯。SingnalR 廣泛使用異步技術來實現即時和最佳性能。
通信模式
SignalR 為客戶端和伺服器之間的通信提供了兩種模型。
1.持久連接
持久連接提供對signalR提供的低級通信協議的直接訪問。每個客戶端到伺服器的連接都由一個 connectionID 標識。因此,在您的應用程式中,如果您需要對連接進行更多控制,您可以在 SingnalR 中使用此模型。該 midel 可用於您想要使用消息傳遞和調度模型而不是遠程調用的地方,或者在任何使用消息模型的現有應用程式中並且您想要移植到 signalR。
2. 集線器
集線器為客戶端和伺服器提供了一個高級 API 來調用彼此的方法。那些從事遠程調用 API 工作的開發人員會非常熟悉它。如果您要在伺服器和客戶端之間發送多種類型的消息,則建議使用集線器,這樣您就不需要自己進行調度。您可以使用集線器或持久連接創建應用程式;唯一需要擔心的是,使用 Hubs 將很容易實現。
所以現在我們對 SignalR 是什麼有了一個概念,所以現在是時候討論“為什麼”了。
為什麼使用 SignalR
使用 SignalR,我們可以創建需要從伺服器進行高頻更新的 Web 應用程式。例如,儀表板、遊戲和聊天應用程式。SignalR 使用 Web 套接字和有助於雙向通信的 HTML5 API。它還為伺服器到客戶端的遠程過程調用 (RPC) 調用提供了 API,這對您來說可能是新事物,因為大多數時候我們使用請求和響應模型。
SignalR 包括自動連接管理,它提供了向所有連接的客戶端或特定客戶端廣播消息的功能。客戶端和伺服器之間的連接是持久的,而在 HTTP 中它不是持久的。
那麼現在在哪裡使用 SignalR:
- 通知:如果您想通知 1 個客戶或所有客戶,那麼我們可以使用 SignalR。通知可以像一些警報、提醒、反饋或評論等。
- 聊天:使用 SignalR 實現聊天應用程式非常容易,可以是一對一聊天,也可以是群聊。
- 遊戲: SignalR 幫助創建需要從伺服器等頻繁推送的遊戲應用程式。
如何使用 SignalR
這裡我不打算直接跳入程式碼。我將首先解釋遠程過程調用 (RPC) 是如何發生的。
假設在伺服器端我們有一個名為 MyServerFunction() 的方法,所以如果我們想從客戶端調用該方法,您可以使用“$.connection.myHub.server.MyServerFunction()”調用它並假設我們有一個 JavaScript名為“myClientFunction()”的函數,我們想從伺服器調用該方法,以便我們可以使用“Client.Client(id).myClientFunction()”調用它。
我知道你們中的許多人都在想,這個連接、集線器和伺服器關鍵字是什麼。所以請耐心等待,很快我會在詳細解釋這兩種模式(持久和集線器)時解釋所有這些。
請參閱下圖以更好地理解。
如您所見,在使用 SignalR 的 RPC 期間,集線器將位於伺服器端,客戶端將具有集線器代理。當代理對像要調用伺服器的真實方法時,該對象實現對真實方法的 Ajax 風格調用。而當伺服器想要調用客戶端方法時,它使用動態類型和將這些調用打包到伺服器的特殊協議來解決。
當應用程式有一個 SignalR 連接並且它想要向伺服器發送一些資料時,這些資料不是以原始形式發送的,SignalR 將該資料與其他信息一起包裝在 JSON 中,並將其全部包裝在 JOSON 有效負載上,然後再發送到伺服器.
我想我們已經解釋了很多關於 SignalR 的概念。我知道你們中的許多人感到無聊,但不要擔心,在我的下一篇文章中,我將介紹有關 SignalR 的所有編碼和實現。我寫這篇文章是因為我沒有找到任何關於 SignalR 的文章可以解釋所有概念以及 SignalR 的工作原理。感謝閱讀並為下一篇文章做好準備。