ASP.NET SignalR 和 ASP.NET Core SignalR 之间的差异Differences between ASP.NET SignalR and ASP.NET Core SignalR

本文内容

ASP.NET Core SignalR 与 ASP.NET SignalR 的客户端或服务器不兼容。本文详细介绍 ASP.NET Core SignalR 中已删除或已更改的功能。

如何识别 SignalR 版本How to identify the SignalR version

ASP.NET SignalRASP.NET Core SignalR
服务器 NuGet 包SignalR无。包含在AspNetCore共享框架中。
客户端 NuGet 包SignalR。SignalR)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 SignalRASP.NET Core SignalR
服务器 NuGet 包SignalRAspNetCore (.net Core)AspNetCore。SignalR(.NET Framework)
客户端 NuGet 包SignalR。机SignalR。JSAspNetCore.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 或更高版本

功能差异Feature differences

自动重新连接Automatic reconnects

在 ASP.NET 中 SignalR:

  • 默认情况下,如果连接被删除,SignalR 会尝试重新连接到服务器。

在 ASP.NET Core SignalR:

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

ASP.NET Core 3.0 之前,SignalR 不支持自动重新连接。如果客户端已断开连接,用户必须显式启动新连接才能重新连接。在 ASP.NET SignalR中,SignalR 在断开连接时尝试重新连接到服务器。

协议支持Protocol support

ASP.NET Core SignalR 支持 JSON,以及基于MessagePack的新二进制协议。此外,还可创建自定义协议。

传输Transports

ASP.NET Core SignalR不支持永久帧传输。

服务器上的差异Differences on the server

ASP.NET Core SignalR 服务器端库包含在AspNetCore中,该应用程序用于 RAZOR 和 MVC 项目的ASP.NET Core Web 应用程序模板。

ASP.NET Core SignalR 是 ASP.NET Core 中间件。必须通过在 Startup.ConfigureServices中调用 AddSignalR 来配置它。

  1. services.AddSignalR()

若要配置路由,请将路由映射到 Startup.Configure 方法中 UseEndpoints 方法调用内的中心。

  1. app.UseRouting();
  2. app.UseEndpoints(endpoints =>
  3. {
  4. endpoints.MapHub<ChatHub>("/hub");
  5. });

若要配置路由,请将路由映射到 Startup.Configure 方法中 UseSignalR 方法调用内的中心。

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

粘滞会话Sticky sessions

ASP.NET SignalR 的扩展模型使客户端可以重新连接到场中的任何服务器并向其发送消息。在 ASP.NET Core SignalR中,客户端必须在连接期间与同一服务器交互。对于使用 Redis 的横向扩展,这意味着需要粘滞会话。对于使用Azure SignalR 服务的扩展,无需使用粘滞会话,因为服务会处理与客户端的连接。

一个连接一个中心Single hub per connection

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

流式处理Streaming

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

状态State

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

删除 PersistentConnectionPersistentConnection removal

在 ASP.NET Core SignalR中,已删除PersistentConnection)类。

GlobalHostGlobalHost

ASP.NET Core 在框架中内置了依赖关系注入 (DI)。服务可以使用 DI 来访问HubContext在 ASP.NET SignalR 中用于获取 HubContextGlobalHost 对象在 ASP.NET Core SignalR中不存在。

HubPipelineHubPipeline

ASP.NET Core SignalR 不支持 HubPipeline 模块。

客户端上的差异Differences on the client

TypeScriptTypeScript

SignalR 客户端 ASP.NET Core 是以TypeScript编写的。使用javascript 客户端时,可以使用 Javascript 或 TypeScript 来编写。

JavaScript 客户端托管在 npmThe JavaScript client is hosted at npm

在 ASP.NET 版本中,JavaScript 客户端通过 Visual Studio 中的 NuGet 包获得。在 ASP.NET Core 版本中, @microsoft/signalr npm 包包含 JavaScript 库。此包不包含在ASP.NET Core Web 应用程序模板中。使用 npm 获取并安装 @microsoft/signalr npm 包。

  1. npm init -y
  2. 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 包。

  1. npm init -y
  2. npm install @aspnet/signalr

jQueryjQuery

已删除对 jQuery 的依赖关系,但项目仍然可以使用 jQuery。

Internet Explorer 支持Internet Explorer support

ASP.NET Core SignalR 需要 Microsoft Internet Explorer 11 或更高版本(ASP.NET SignalR 支持的 Microsoft Internet Explorer 8 及更高版本)。

JavaScript 客户端方法语法JavaScript client method syntax

JavaScript 语法已在 SignalR的 ASP.NET 版本中发生了更改。不要使用 $connection 对象,而是使用HubConnectionBuilder API 创建连接。

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

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

JavaScript 语法已在 SignalR的 ASP.NET 版本中发生了更改。不要使用 $connection 对象,而是使用HubConnectionBuilder API 创建连接。

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

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

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

创建客户端方法后,启动中心连接。catch方法链接到日志或处理错误。

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

中心代理Hub proxies

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

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

.NET 和其他客户端.NET and other clients

AspNetCore.SignalR。客户端NuGet 包包含用于 ASP.NET Core SignalR的 .net 客户端库。

使用 HubConnectionBuilder 创建和生成与集线器的连接的实例。

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

横向扩展差异Scaleout differences

ASP.NET SignalR 支持 SQL Server 和 Redis。ASP.NET Core SignalR 支持 Azure SignalR 服务和 Redis。

ASP.NETASP.NET

ASP.NET CoreASP.NET Core

其他资源Additional resources