ASP.NET Core SignalR:集线器Hubs
一、什么是集线器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 | 返回连接HttpContext的null,如果连接不与 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提供OnConnectedAsync和OnDisconnectedAsync虚拟方法来管理和跟踪连接。 重写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的更多相关文章
- Asp.Net Core SignalR 与微信小程序交互笔记
什么是Asp.Net Core SignalR Asp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给 ...
- ASP.NET Core SignalR
ASP.NET Core SignalR 是微软开发的一套基于ASP.NET Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给Web客户端. 功能 自动管理连接 允许同时广播 ...
- ASP.NET Core SignalR:基础概述
一.简介 ASP.NET Core SignalR 是一个开源代码库,它简化了向应用添加实时 Web 功能的过程. 实时 Web 功能使服务器端代码能够即时将内容推送到客户端. SignalR 的适用 ...
- ASP.NET CORE使用WebUploader对大文件分片上传,并通过ASP.NET CORE SignalR实时反馈后台处理进度给前端展示
本次,我们来实现一个单个大文件上传,并且把后台对上传文件的处理进度通过ASP.NET CORE SignalR反馈给前端展示,比如上传一个大的zip压缩包文件,后台进行解压缩,并且对压缩包中的文件进行 ...
- ASP.NET Core SignalR中的流式传输
什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...
- Asp.Net Core SignalR 用泛型Hub优雅的调用前端方法及传参
继续学习 最近一直在使用Asp.Net Core SignalR(下面成SignalR Core)为小程序提供websocket支持,前端时间也发了一个学习笔记,在使用过程中稍微看了下它的源码,不得不 ...
- [asp.net core]SignalR一个例子
摘要 在一个后台管理的页面想实时监控一些操作的数据,想到用signalR. 一个例子 asp.net core+signalR 使用Nuget安装包:Microsoft.AspNetCore.Sign ...
- ASP.NET Core SignalR 使用
SignalR: 实时 Web 功能使服务器端代码能够即时将内容推送到客户端(包括B/S,C/S,Andriod). SignalR最新版本为3.0(截止2020-02-28) SignalR ...
- 使用websocket连接(对接)asp.net core signalr
使用通用websocket连接asp.net core signalr 一.背景介绍 signalr的功能很强大,可以为我们实现websocket服务端节省不少的时间.但是可能由于不同的环境,我们在对 ...
随机推荐
- 什么是HTML,HTML的简介,HTML结构
html:超文本标记语言(Hyper Text Markup Language) ==============基本结构================= <html><!--最外层为 ...
- Docker部署网站之后映射域名
Docker中部署tomcat相信大家也都知道,不知道的可以google 或者bing 一下.这里主要是为了记录在我们启动容器之后,tomcat需要直接定位到网站信息,而不是打开域名之后,还得加个bl ...
- CentOS 安装 JDK 三种形式详细总结
一.下载 JDK 点击下载:jdk-8u211-linux-x64.tar.gz 根据需要选择对应版本和位数,并将文件放入CentOS中的相关目录中,以 /java/jdk 目录为例,执行 m ...
- Django+zTree构建组织架构树
树,因其清晰明了的展现形式而被广泛的使用 日常的开发过程中我们需要经常与"树"打交道,例如公司的组织架构树.服务器的项目归属树,管理后台侧边树等等,本篇文章介绍关于树的两个内容 多 ...
- Hive 系列(七)—— Hive 常用 DML 操作
一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (p ...
- Linux下sudo配置
转载请注明: 凌云物网智科嵌入式实验室: http://iot-yun.com/ 郭文学<guowenxue@gmail.com> [guowenxue@centos6_studi ...
- C#_细说Cookie_Json Helper_Cookies封装
阅读目录 开始 Cookie 概述 Cookie的写.读过程 使用Cookie保存复杂对象 Js中读写Cookie Cookie在Session中的应用 Cookie在身份验证中的应用 Cookie的 ...
- WPF注册热键后处理热键消息(非winform方式)
由于最近在做wpf版的截图软件,在处理全局热键的时候,发现国内博客使用的都是winform窗体的键盘处理方式,此方式需要使用winform的动态库,如此不协调的代码让我开始在github中寻找相关代码 ...
- 读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」
0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.PYTHON开发利器之VS Code之 ...
- Java并发编程——线程池的使用
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...