ASP.NET SignalR 與 ASP.NET Core SignalR 之間的差異

ASP.NET Core SignalR 與 ASP.NET SignalR 的用戶端或伺服器不相容。 本文詳細說明 ASP.NET Core SignalR 中已移除或變更的功能。

如何識別 SignalR 版本

ASP.NET SignalR ASP.NET Core SignalR
伺服器 NuGet 套件 Microsoft.AspNet.SignalR 無。 包含在 Microsoft.AspNetCore.App 共用架構中。
用戶端 NuGet 套件 Microsoft.AspNet.SignalR.Client
Microsoft.AspNet.SignalR.JS
Microsoft.AspNetCore.SignalR.Client
JavaScript 用戶端 npm 套件 signalr @microsoft/signalr
Java 用戶端 GitHub 存放庫 (已被取代) Maven 套件 com.microsoft.signalr
伺服器應用程式類型 ASP.NET (System.Web) 或 OWIN 自我裝載 ASP.NET Core
支援的伺服器平台 .NET Framework 4.5 或更新版本 .NET Core 3.0 或更新版本
ASP.NET SignalR ASP.NET Core SignalR
伺服器 NuGet 套件 Microsoft.AspNet.SignalR Microsoft.AspNetCore.App (.NET Core)
Microsoft.AspNetCore.SignalR (.NET Framework)
用戶端 NuGet 套件 Microsoft.AspNet.SignalR.Client
Microsoft.AspNet.SignalR.JS
Microsoft.AspNetCore.SignalR.Client
JavaScript 用戶端 npm 套件 signalr @aspnet/signalr
Java 用戶端 GitHub 存放庫 (已被取代) Maven 套件 com.microsoft.signalr
伺服器應用程式類型 ASP.NET (System.Web) 或 OWIN 自我裝載 ASP.NET Core
支援的伺服器平台 .NET Framework 4.5 或更新版本 .NET Framework 4.6.1 或更新版本
.NET Core 2.1 或更新版本

功能差異

自動重新連線

在 ASP.NET SignalR中:

  • 根據預設,如果已斷線,SignalR 會嘗試重新連線至伺服器。

在 ASP.NET Core SignalR 中:

HubConnection connection = new HubConnectionBuilder()
    .WithUrl(new Uri("http://127.0.0.1:5000/chathub"))
    .WithAutomaticReconnect()
    .Build();
const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .withAutomaticReconnect()
    .build();

在 ASP.NET Core 3.0 之前,SignalR 不支援自動重新連線。 如果用戶端已中斷連線,使用者必須明確啟動新的連線才能重新連線。 在 ASP.NET SignalR 中,如果已斷線,SignalR 會嘗試重新連線至伺服器。

通訊協定支援

ASP.NET Core SignalR 支援 JSON,以及以 MessagePack 為基礎的新二進位通訊協定。 此外,也可以建立自訂通訊協定。

傳輸

ASP.NET Core SignalR 不支援 Forever Frame 傳輸。

伺服器上的差異

ASP.NET Core SignalR 伺服器端程式庫包含在 Microsoft.AspNetCore.App 中,用於 Razor 和 MVC 專案兩者的 ASP.NET Core Web 應用程式範本中。

ASP.NET Core SignalR 是 ASP.NET Core 中介軟體。 必須透過呼叫 Startup.ConfigureServices 中的 AddSignalR 加以設定。

services.AddSignalR()

若要設定路由,請將路由對應至 Startup.Configure 方法中 UseEndpoints 方法呼叫內的中樞。

app.UseRouting();

app.UseEndpoints(endpoints =>
{
    endpoints.MapHub<ChatHub>("/hub");
});

若要設定路由,請將路由對應至 Startup.Configure 方法中 UseSignalR 方法呼叫內的中樞。

app.UseSignalR(routes =>
{
    routes.MapHub<ChatHub>("/hub");
});

黏性工作階段

ASP.NET SignalR 的向外延展模型允許用戶端重新連線,並將訊息傳送至伺服器陣列中的任何伺服器。 在 ASP.NET Core SignalR 中,用戶端必須在連線期間與同一部伺服器進行互動。 對於使用 Redis 的向外延展,這表示需要黏性工作階段。 對於使用 Azure SignalR Service 的向外延展,則不需要黏性工作階段,因為該服務會處理與用戶端的連線。

每個連線的單一中樞

在 ASP.NET Core SignalR 中,連線模型已經過簡化。 直接連線到單一中樞,而不是使用單一連線來共用對多個中樞的存取。

串流

ASP.NET Core SignalR 現在支援將資料從中樞串流至用戶端。

州/省

已移除在用戶端與中樞之間傳遞任意狀態的能力 (通常稱為 HubState),以及對進度訊息的支援。 目前沒有中樞 Proxy 的對應項目。

PersistentConnection 移除

在 ASP.NET Core SignalR 中,已移除 PersistentConnection 類別。

GlobalHost

ASP.NET Core 在框架中內建了相依性插入 (DI)。 服務可以使用 DI 來存取 HubCoNtext。 ASP.NET SignalR 中用來取得 HubContextGlobalHost 物件,在 ASP.NET Core SignalR 中並不存在。

HubPipeline

ASP.NET Core SignalR 不支援 HubPipeline 模組。

用戶端的差異

TypeScript

ASP.NET Core SignalR 用戶端是用 TypeScript 撰寫的。 使用 JavaScript 用戶端時,您可以用 JavaScript 或 TypeScript 撰寫。

JavaScript 用戶端裝載於 npm

在 ASP.NET 版本中,JavaScript 用戶端是透過 Visual Studio 中的 NuGet 套件取得的。 在 ASP.NET Core 版本中,@microsoft/signalr npm 套件包含 JavaScript 程式庫。 該套件未包含在 ASP.NET Core Web 應用程式範本中。 請使用 npm 取得並安裝 @microsoft/signalr npm 套件。

npm init -y
npm install @microsoft/signalr

在 ASP.NET 版本中,JavaScript 用戶端是透過 Visual Studio 中的 NuGet 套件取得的。 在 ASP.NET Core 版本中,@aspnet/signalr npm 套件包含 JavaScript 程式庫。 該套件未包含在 ASP.NET Core Web 應用程式範本中。 請使用 npm 取得並安裝 @aspnet/signalr npm 套件。

npm init -y
npm install @aspnet/signalr

jQuery

已移除 jQuery 的相依性,不過專案仍然可以使用 jQuery。

Internet Explorer 支援

ASP.NET Core SignalR 不支援 Microsoft Internet Explorer,而 ASP.NET SignalR 支援 Microsoft Internet Explorer 8 或更新版本。 如需詳細資訊,請參閱 ASP.NET Core SignalR 支援的平台

JavaScript 用戶端方法語法

JavaScript 語法已從 ASP.NET 版本的 SignalR 進行變更。 該語法是使用 HubConnectionBuilder API 建立連線,而不是使用 $connection 物件。

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/hub")
    .build();

使用 on 方法來指定中樞可以呼叫的用戶端方法。

JavaScript 語法已從 ASP.NET 版本的 SignalR 進行變更。 該語法是使用 HubConnectionBuilder API 建立連線,而不是使用 $connection 物件。

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/hub")
    .build();

使用 on 方法來指定中樞可以呼叫的用戶端方法。

connection.on("ReceiveMessage", (user, message) => {
    const msg = message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    const encodedMsg = `${user} says ${msg}`;
    console.log(encodedMsg);
});

建立用戶端方法之後,請啟動中樞連線。 鏈結 catch 方法來記錄或處理錯誤。

connection.start().catch(err => console.error(err));

中樞 Proxy

不再自動產生中樞 Proxy。 相反地,方法名稱會以字串形式傳入 invoke API。

不再自動產生中樞 Proxy。 相反地,方法名稱會以字串形式傳入 invoke API。

.NET 和其他用戶端

Microsoft.AspNetCore.SignalR.Client NuGet 套件包含適用於 ASP.NET Core SignalR 的 .NET 用戶端程式庫。

使用 HubConnectionBuilder 來建立和編譯與中樞的連線實例。

connection = new HubConnectionBuilder()
    .WithUrl("url")
    .Build();

向外延展差異

ASP.NET SignalR 支援 SQL Server 和 Redis。 ASP.NET Core SignalR 支援 Azure SignalR Service 和 Redis。

ASP.NET

ASP.NET Core

其他資源