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 中:
- 自動重新連線是透過 .NET 用戶端和 JavaScript 用戶端選擇加入的:
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 中用來取得 HubContext
的 GlobalHost
物件,在 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, "&").replace(/</g, "<").replace(/>/g, ">");
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。