一、什么是集线器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. sql语句优化:尽量使用索引避免全表扫描

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  2. JavaWeb——JSP开发1

    1.什么是jsp,为什么要使用jsp. 再使用idea创建完一个web工程后,在webapp目录下会生成一个index.jsp 直接编译运行,网站将自动打开这样一个网页: 所以我们可以推测这个inde ...

  3. postman-使用教程

    postman postman是一款非常方便的API测试工具,可以帮我们快速的发起HTTP请求,下面记录一下postman的基本使用. postman安装 postman下载地址 下载安装打开之后就是 ...

  4. cmd中,查询sqlcmd命令的选项

    像我这样的小白,有时候看到-d,-S,-P这些都不知道什么意思,后面知道了是一些命令的选项.如sqlcmd,打开cmd,输入sqlcmd -?        即可获得选项的含义. .

  5. 查看centos中的用户和用户组和修改密码

    查看centos中的用户和用户组 1.用户列表文件: vim /etc/passwd/ 2.用户组列表文件: vim /etc/group 3.查看系统中有哪些用户: cut -d : -f /etc ...

  6. 危险的Hystrix线程池

    本文介绍Hystrix线程池的工作原理和参数配置,指出存在的问题并提供规避方案,阅读本文需要对Hystrix有一定的了解. 文本讨论的内容,基于hystrix 1.5.18: <dependen ...

  7. .NET Core 单元测试

    应用程序测试的类型很多,包括集成测试,Web 测试,负载测试等.在最底层的是单元测试,此测试可以测试单个软件组件或方法.单元测试一般只测试开发人员的代码,不应该测试基础结构普.问题,如数据库,文件系统 ...

  8. Linux 设置服务开机启动

    首先来了解一下 service命令是Redhat Linux兼容的发行版中用来控制系统服务的实用工具,它以启动.停止.重新启动和关闭系统服务,还可以显示所有系统服务的当前状态. service +(自 ...

  9. Codeforces 936B

    题意略. 思路: 图论里掺杂了一些动态规划. 有几个注意点: 1.dp时状态的设计:因为我们要寻求的是出度为0并且可以从起点走奇数步抵达的点,由于同一个点可以通过多种方式到达. 并且我们在获得奇数步点 ...

  10. [Python] 用python做一个游戏辅助脚本,完整思路

    一.说明 简述:本文将以4399小游戏<宠物连连看经典版2>作为测试案例,通过识别小图标,模拟鼠标点击,快速完成配对.对于有兴趣学习游戏脚本的同学有一定的帮助. 运行环境:Win10/Py ...