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 包 | SignalR | 无。 包含在AspNetCore共享框架中。 |
客户端 NuGet 包 | SignalR。机 SignalR。JS |
AspNetCore.SignalR。机 |
JavaScript 客户端 npm 包 | signalr | @microsoft/signalr |
Java 客户端 | GitHub 存储库(已弃用) | Maven 包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 包 | SignalR | Microsoft.AspNetCore.App (.NET Core) AspNetCore。SignalR (.NET Framework) |
客户端 NuGet 包 | SignalR。机 SignalR。JS |
AspNetCore.SignalR。机 |
JavaScript 客户端 npm 包 | signalr | @aspnet/signalr |
Java 客户端 | GitHub 存储库(已弃用) | Maven 包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不支持永久帧传输。
服务器上的差异
ASP.NET Core SignalR 服务器端库包含在AspNetCore中,该应用程序用于 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 服务的扩展,无需使用粘滞会话,因为服务会处理与客户端的连接。
一个连接一个中心
在 ASP.NET Core SignalR中,连接模型已简化。 可直接连接到单个中心,不必通过单个连接来共享对多个中心的访问。
流式传输
ASP.NET Core SignalR 现在支持从中心到客户端的流数据。
State
能够在客户端和中心之间传递任意状态(通常称为 HubState
),并支持进度消息。 目前没有中心代理的对应项。
删除 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
SignalR 客户端 ASP.NET Core 是以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 11 或更高版本(ASP.NET SignalR 支持的 Microsoft Internet Explorer 8 及更高版本)。
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, "&").replace(/</g, "<").replace(/>/g, ">"); const encodedMsg = `${user} says ${msg}`; console.log(encodedMsg); });
创建客户端方法后,启动中心连接。 链接一种 catch 方法以记录或处理错误。
connection.start().catch(err => console.error(err));
中心代理
中心代理不再自动生成。 相反,方法名称将以字符串形式传递到 invoke API。
中心代理不再自动生成。 相反,方法名称将以字符串形式传递到 invoke API。
.NET 和其他客户端
AspNetCore.SignalR。客户端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。