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 Self-Host 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 Self-Host 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 中,可用于 ASP.NET Core Web Application 模板中的 Razor 和 MVC 项目。

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 服务的横向扩展,无需粘滞会话,因为服务会处理与客户端的连接。

每个连接一个中心

在 ASP.NET Core SignalR 中,连接模型已简化。 直接连接到单个中心,而不是使用单个连接来共享对多个中心的访问。

流式处理

ASP.NET Core SignalR 现在支持从中心到客户端的数据流式传输

状态

删除了在客户端和中心之间传递任意状态(通常称为 HubState)的功能,以及对进度消息的支持。 目前没有中心代理的对应物。

删除 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 语法已从 SignalR 的 ASP.NET 版本更改。 使用 HubConnectionBuilder API 创建连接,而非使用 $connection 对象。

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

使用 on 方法指定中心可以调用的客户端方法。

JavaScript 语法已从 SignalR 的 ASP.NET 版本更改。 使用 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));

中心代理

中心代理不再自动生成。 方法名称作为字符串传递到调用 API 中。

中心代理不再自动生成。 方法名称作为字符串传递到调用 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 服务和 Redis。

ASP.NET

ASP.NET Core

其他资源