一、什么是集线器hubs

  通过SignalR的集线器hubs中定义的方法,服务器可以调用连接中的客户端定义的方法,而客户端也可以调用服务器端集线器中定义的方法。SignalR负责实现了客户端和服务器之间的实时通信。

二、配置SignalR的hubs

  SignalR通过在Startup.ConfigureServices中调用services.AddSignalR()来配置中间件服务。

services.AddSignalR()

  将 SignalR 功能添加到 ASP.NET Core 应用程序时,通过在Startup.Configure方法中调用app.UseSignalR来设置 SignalR 路由。

app.UseSignalR(routes =>
{
  routes.MapHub<BaseHub>("/Hub");
});

三、创建集线器Hubs

  通过继承Hub类来创建集线器类,并添加public修饰的方法。可以通过特性[HubMethodName]来修改方法的名称。

public async Task SendMessage(string user,string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}

  注意:   

  • 客户端只能调用集线器类中定义的public的方法。
  • 每次客户端访问服务器的集线器类的时候都是在新的对象实例上运行的,所以不能将状态存储在集线器类中。
  • SignalR的代码是异步模式的,所以集线器中的方法也都是异步的。

四、参数和返回类型

  将集线器类和客户端接收代码改为如下所示:

public class paramsEntity
{
public string user { get; set; }
public string message { get; set; }
} public async Task SendMessage(paramsEntity param)
{
await Clients.All.SendAsync("ReceiveMessage", param);
}
//接收服务器端消息ReceiveMessage的处理程序
connection.on("ReceiveMessage", function (param) {
  if (param.user)
    $('#content').append(param.user + ":");
  if (param.message)
    $('#content').append(param.message + ":");
}); //发送消息至服务器端SendMessage方法
connection.invoke("SendMessage", { user, message }).catch(function (err) {
  return console.error(err.toString());
});

  通过运行可以发现,SignalR会通过序列化和反序列化来处理复杂的参数和返回类型。如果客户端传递的参数和服务器端不一致会导致方法无法被匹配到而报错以下错误。

Microsoft.AspNetCore.SignalR.HubException: Failed to invoke 'SendMessage' due to an error on the server.

  所以使用自定义对象作为参数更加的灵活多变。

五、Hub的对象

  1、Context

  Hub类具有一个上下文Context,包含连接中的以下属性以及方法。

属性 描述
ConnectionId 获取由 SignalR 分配的连接的唯一 ID。每个连接都有一个连接 ID
UserIdentifier 获取用户标识符。 默认情况下,SignalR 使用ClaimTypes.NameIdentifier与连接ClaimsPrincipal关联的作为用户标识符。
User 获取与ClaimsPrincipal当前用户关联的。
Items 获取可用于在此连接的范围内共享数据的键/值集合。数据可以存储在此集合中,它将在不同的集线器方法调用中持久保存。
Features 获取连接上的可用功能的集合。目前,在大多数情况下不需要此集合,因此不会对其进行详细介绍。
ConnectionAborted 获取一个CancellationToken,它将在连接中止时通知。
方法 描述
GetHttpContext 返回连接HttpContextnull,如果连接不与 HTTP 请求关联,则为。对于 HTTP 连接,可以使用此方法来获取 HTTP 标头和查询字符串等信息。
Abort 中止连接。

2、Clients

  Hub类的Clients属性包含服务器和客户端之间通信的方法和属性。

属性 描述
All 在所有连接的客户端上调用方法
Caller 在调用集线器方法的客户端上调用方法
Others 在所有连接的客户端上调用方法,但调用方法的客户端除外
方法 描述
AllExcept 在所有连接的客户端(指定的连接除外)上调用方法
Client 在特定连接的客户端上调用方法
Clients 在多个特定连接的客户端上调用方法
Group 对指定组中的所有连接调用方法
GroupExcept 对指定组中的所有连接调用方法,指定的连接除外 
Groups 在多组连接上调用方法
OthersInGroup 对一组连接调用方法,而不包括调用该集线器方法的客户端
User 对与特定用户关联的所有连接调用方法
Users 对与指定用户相关联的所有连接调用方法

  表中的每个属性或方法都返回一个SendAsync包含方法的对象。 SendAsync方法允许你提供要调用的客户端方法的名称和参数。

六、强类型的hub

  使用SendAsync的时候需要传入字符串来指定调用客户端的方法,这就会导致拼写错误等问题引发程序运行错误。

  通过使用强类型Hub<T>将客户端的方法约定为接口,这样Hub的Clients的将会禁用Sendasync方法,而只能调用我们约定的接口方法。

    public interface IHub
{
Task ReceiveMessage(string user, string message);
Task ReceiveMessage(string message);
}
    public class BaseHub : Hub<IHub>
{
public async Task SendMessage(string user, string message)
{
await Clients.All.ReceiveMessage(user, message);
}
}

七、处理连接事件

  SignalR的hub提供OnConnectedAsyncOnDisconnectedAsync虚拟方法来管理和跟踪连接。 重写OnConnectedAsync虚拟方法,以便在客户端连接到集线器时执行操作,如将其添加到组。

public override async Task OnConnectedAsync()
{
await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnConnectedAsync();
}

  重写OnDisconnectedAsync虚拟方法,以便在客户端断开连接时执行操作。 如果客户端故意断开连接(例如connection.stop(),通过调用),则exception参数将为null。 但是,如果客户端由于错误(例如网络故障)而断开连接,则exception参数将包含描述失败的异常。

public override async Task OnDisconnectedAsync(Exception exception)
{
await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnDisconnectedAsync(exception);
}

ASP.NET Core SignalR:集线器Hubs的更多相关文章

  1. Asp.Net Core SignalR 与微信小程序交互笔记

    什么是Asp.Net Core SignalR Asp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给 ...

  2. ASP.NET Core SignalR

    ASP.NET Core SignalR 是微软开发的一套基于ASP.NET Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给Web客户端. 功能 自动管理连接 允许同时广播 ...

  3. ASP.NET Core SignalR:基础概述

    一.简介 ASP.NET Core SignalR 是一个开源代码库,它简化了向应用添加实时 Web 功能的过程. 实时 Web 功能使服务器端代码能够即时将内容推送到客户端. SignalR 的适用 ...

  4. ASP.NET CORE使用WebUploader对大文件分片上传,并通过ASP.NET CORE SignalR实时反馈后台处理进度给前端展示

    本次,我们来实现一个单个大文件上传,并且把后台对上传文件的处理进度通过ASP.NET CORE SignalR反馈给前端展示,比如上传一个大的zip压缩包文件,后台进行解压缩,并且对压缩包中的文件进行 ...

  5. ASP.NET Core SignalR中的流式传输

    什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...

  6. Asp.Net Core SignalR 用泛型Hub优雅的调用前端方法及传参

    继续学习 最近一直在使用Asp.Net Core SignalR(下面成SignalR Core)为小程序提供websocket支持,前端时间也发了一个学习笔记,在使用过程中稍微看了下它的源码,不得不 ...

  7. [asp.net core]SignalR一个例子

    摘要 在一个后台管理的页面想实时监控一些操作的数据,想到用signalR. 一个例子 asp.net core+signalR 使用Nuget安装包:Microsoft.AspNetCore.Sign ...

  8. ASP.NET Core SignalR 使用

    SignalR: 实时 Web 功能使服务器端代码能够即时将内容推送到客户端(包括B/S,C/S,Andriod).   SignalR最新版本为3.0(截止2020-02-28)   SignalR ...

  9. 使用websocket连接(对接)asp.net core signalr

    使用通用websocket连接asp.net core signalr 一.背景介绍 signalr的功能很强大,可以为我们实现websocket服务端节省不少的时间.但是可能由于不同的环境,我们在对 ...

随机推荐

  1. android——SQLite数据库存储(操作)

    public class MyDatabaseHelper extends SQLiteOpenHelper { //把定义SQL建表语句成字符串常量 //图书的详细信息 //ID.作者.价格.页数. ...

  2. java集合类的相关转换

    下面的的案例,基本上是以代码为主,文字的描述较少,后期有时间会继续添加. ArrayToList public void ArrayToList() { System.out.println(&quo ...

  3. 做梦也没有想到:Windows 上的 .NET Core 表现更糟糕

    昨天晚上 18:15 左右我们发布了跑在 Windows 上 .NET Core 博客系统,本想与 .NET Framework 版进行同“窗”的较量,结果刚发布上线就发现 CPU 占用异常高,发布不 ...

  4. 以股票案例入门基于SVM的机器学习

    SVM是Support Vector Machine的缩写,中文叫支持向量机,通过它可以对样本数据进行分类.以股票为例,SVM能根据若干特征样本数据,把待预测的目标结果划分成“涨”和”跌”两种,从而实 ...

  5. Javascript十大排序算法的实现方法

    上一篇中,实现了Javascript中的冒泡排序方法,下面把剩余的九种排序算法实现 选择排序: var array = []; for(var i=0;i<100000;i++){ var x ...

  6. 纯数据结构Java实现(5/11)(Set&Map)

    纯数据结构Java实现(5/11)(Set&Map) Set 和 Map 都是抽象或者高级数据结构,至于底层是采用树还是散列则根据需要而定. 可以细想一下 TreeMap/HashMap, T ...

  7. Mysql主从复制原理及搭建

    ## Mysql主从复制原理 主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中.对于多级复制,数据库服务器即可充当主机,也可充当从 ...

  8. Flink集群Standalone启动脚本(源码分析)

    整个Flink集群的角色分为Jobmanager和TaskManager 以Standalone为例来看一下脚本里面是怎样启动集群的 找到源码的dist这里面包含了启动的脚本文件 standalone ...

  9. Java 集合源码分析(一)HashMap

    目录 Java 集合源码分析(一)HashMap 1. 概要 2. JDK 7 的 HashMap 3. JDK 1.8 的 HashMap 4. Hashtable 5. JDK 1.7 的 Con ...

  10. Fire Balls 04——砖塔的创建,动态上升以及旋转

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...