SignalR for ASP.NET Core 2.0

SignalR for ASP.NET Core 2.0

发布时间:2019-10-07 11:28   ASP.NET CoreSignalR


什么是新的?

用于ASP.NET Core的SignalR是对原始SignalR的重写。我们研究了当今用户常见的SignalR使用模式和问题,并决定重写SignalR是正确的选择。新的SignalR更简单,更可靠并且更易于使用。尽管有这些潜在的变化,我们仍在努力确保面向用户的API与以前的版本非常相似。

JavaScript / TypeScript客户端

用于ASP.NET Core的SignalR有一个全新的JavaScript客户端。新客户端是用TypeScript编写的,不再依赖jQuery。还可以从Node.js中使用带有一些其他依赖项的客户端。

客户端以npm模块的形式分发,该模块  包含客户端的Node.js版本(可通过require使用)以及供浏览器使用的版本,可使用<script>标记将其包含在内模块中包含的客户端的TypeScript声明使从TypeScript应用程序使用客户端变得容易。

JavaScript客户端可在最新的Chrome,FireFox,Edge,Safari和Opera浏览器以及Internet Explorer 11、10、9版本上运行。(并非所有传输都与每种浏览器兼容)。不支持Internet Explorer 8及更低版本。

支持二进制协议

用于ASP.NET Core的SignalR提供了两个内置的集线器协议–基于JSON的文本协议和基于MessagePack的二进制协议使用MessagePack协议的消息通常比使用JSON协议的消息小。例如,使用基于JSON的协议时,返回整数值1的hub方法将为43个字节,而使用MessagePack时仅返回16个字节。(请注意,大小的差异可能取决于消息类型,消息内容和所使用的传输方式-通过“服务器发送事件”传输发送的二进制消息将以base64编码,因为“服务器发送事件”是文本传输。)

支持自定义协议

SignalR集线器协议记录在GitHub上  ,现在具有扩展点,使您可以插入自定义实现。

流媒体

现在可以将数据从服务器流传输到客户端。与常规的Hub方法调用不同,流式传输意味着服务器能够在调用完成之前将结果发送到客户端。

将SignalR与Bare Websockets一起使用

连接到SignalR的过程已简化到使用websockets的程度,现在可以在没有任何客户端的情况下通过单个请求连接到服务器。

简化的横向扩展模型

不幸的是,在扩展应用程序时,没有“一刀切”的模型–每个应用程序都是不同的,并且在扩展应用程序时需要考虑不同的要求。我们已经努力改善和简化横向扩展模型,并在此Alpha中提供了基于Redis的横向扩展组件。正在评估最终发行版对其他提供程序的支持,例如服务总线。

有什么变化?

我们为SignalR for ASP.NET Core添加了许多新功能,但我们也决定取消对某些现有功能的支持或更改其工作方式。其后果之一是,SignalR for ASP.NET Core与SignalR的早期版本不兼容。这意味着您不能将旧服务器与新客户端一起使用,也不能将旧客户端与新服务器一起使用。以下是SignalR新版本中已删除或更改的功能。

简化的连接模型

在SignalR的现有版本中,客户端将尝试启动与服务器的连接,如果失败,它将尝试使用其他传输。如果客户端无法使用任何可用的传输连接到服务器,则客户端将无法启动连接。新的SignalR不再支持此功能。

不再支持的另一功能是自动重新连接。如果连接断开,以前SignalR会尝试重新连接到服务器。现在,如果客户端断开连接,则用户如果要重新连接,则必须明确启动新连接。请注意,这甚至在之前是必需的–如果客户端无法在重新连接超时内成功重新连接,则客户端将停止其重新连接尝试。删除自动重新连接的另一个原因是存储发送给客户端的消息的成本很高。默认情况下,服务器会记住发送给客户端的最后1000条消息,以便可以重播客户端脱机时错过的消息。由于每个连接都有自己的缓冲区,因此存储这些消息的内存占用非常大。

现在需要粘性会话

由于在SignalR的早期版本中横向扩展是如何工作的,客户端可以重新连接和/或将消息发送到服务器场中的任何服务器。由于横向扩展模型的更改以及不支持重新连接,因此不再支持此功能。现在,一旦客户端连接到服务器,它就需要在连接期间与该服务器进行交互。

每个连接一个集线器

新版本的SignalR不支持每个连接具有多个集线器。这样可以简化客户端API,并简化将身份验证策略和其他中间件应用于集线器连接的过程。另外,不再需要在连接开始之前订阅集线器方法。

其他变化。

删除了在客户端和集线器之间传递任意状态(即HubState)的功能,以及对Progress消息的支持。我们目前也没有创建中心代理的对应对象。

入门

设置SignalR相对容易。创建ASP.NET Core应用程序后,需要添加对Microsoft.AspNetCore.SignalR的引用,如下所示

和枢纽类:

该中心包含一个方法,该方法一旦被调用,在每个连接的客户端上调用Send方法。

添加集线器类后,您需要配置服务器以将发送到聊天端点的请求传递给SignalR:

设置服务器后,您可以从客户端调用集线器方法,并从服务器接收调用。要在浏览器中使用JavaScript客户端,您需要首先使用以下命令安装signalr-client npm模块:

注意:在宣布此Alpha版本之后,此包在SignalR的Preview1中重命名。现在是信号器,而不是信号器客户端。

然后将signalr-client.js复制到您的脚本文件夹,并使用<script>标记包含在您的页面中

包含脚本之后,您可以启动连接并与服务器交互,如下所示:

要使用SignalR托管客户端,您需要添加对Microsoft.AspNetCore.SignalR.Client的引用

然后,您可以调用中心方法并接收如下调用:

如果要利用流技术,则需要创建一个集线器方法,该方法返回ReadableChannel <T>IObservable <T>这是一个中心方法的示例,该方法从我们从旧的SignalR移植StockTicker样本中将股票价格流式传输到客户端

调用此中心方法的JavaScript代码如下所示:

每次服务器发送流项目时,都会调用displayStock客户端函数。

从C#客户端调用流式集线器方法并读取项目如下所示:

从现有的SignalR迁移

我们将在未来几周内发布从现有SignalR指南迁移过来的内容。

已知的问题

这是一个Alpha版本,我们知道一些问题:

  • 如果服务器在IIS后面运行,则闲置两分钟后,使用服务器发送事件传输的连接可能会断开连接
  • 如果托管SignalR的服务器由于IIS中的限制而在Windows 7或Windows Server 2008 R2上的IIS后面运行,则WebSockets传输将无法工作
  • 如果在关闭客户端的同时仍在接收来自服务器的数据,则C#客户端中的ServerSentEvents传输可能会挂起
  • 客户端无法取消流调用
  • 由于UglifyJS不支持ES6,因此在angular-cli中使用TypeScript客户端生成应用程序的生产版本失败。如本评论所述,可以解决此问题