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:

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 中用于获取 HubContextGlobalHost 对象在 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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    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。

ASP.NET

ASP.NET Core

其他资源

上一篇:在 ASP.NET Core 中使用流式处理 SignalR

下一篇:ASP.NET Core 中的 WebSocket 支持

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程