ASP.NET Core SignalR 是微软开发的一套基于ASP.NET Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给Web客户端。

功能

  • 自动管理连接

  • 允许同时广播到所有客户端

  • 也可以广播到指定的组或者特定的客户端

  • 在Github上开源,传送门(https://github.com/aspnet/signalr)

SignalR 提供了多种连接方式,在现代化应用中,WebSocket是最佳的传输协议,在客户端无法实现WebSocket协议的时候,SignalR就会采取其他方式,比如Server-Sent或者长轮询(在ws未出现之前,我们讨论的推拉模式)

中心 Hubs

SignalR是采用中心客户端和服务器进行通讯。

中心是一种高级的管道,允许客户端和服务器之间相互调用方法。

中心通过强类型参数传递给方法,进行模型绑定

Hubs.Clients

Clients属性包含了所有的客户端连接信息,它包含了3个属性:

  • All 所有客户端

  • Caller 进行此次请求的客户端

  • Others 排除此次请求客户端的其他客户端

包含了多个方法:

  • = AllExcept 在指定的连接除外的所有连接的客户端上调用方法

  • Client 在特定连接的客户端上调用方法

  • Clients 在特定连接的客户端上调用方法

  • Group 调用指定的组中的一种对所有连接方法

  • GroupExcept 调用中指定的组,除非指定连接到的所有连接的方法

  • Groups 调用一种对多个组的连接方法

  • OthersInGroup 调用一种对一组的连接,不包括客户端调用 hub 方法方法

  • User 调用一种对与特定用户关联的所有连接方法

  • Users 调用一种对与指定的用户相关联的所有连接方法

每个属性和方法返回的对象都包含一个SendAsync方法,可以对客户端进行调用。

HubContext

可以在应用其他地方通过使用IHubContext,达到调用Hub的目的。

两种协议

  • 文本协议:JSON

  • 二进制协议:MessagePack(https://msgpack.org/)

MessagePack类似于JSON,但传输比JSON更快,数据大小比JSON更小

服务器事项

  • 创建的Hub必须继承Microsoft.AspNetCore.SignalR.Hub,Hub类已经包含了管理连接、组和发送接收消息的属性及事件

  • 在Hub中使用的方法应该尽量使用异步的方式,因为SignalR在发送和接收消息的时候使用的是异步方法。

  • 在Startup.ConfigureServices中通过services.AddSignalR对SignalR进行注册

  • 在Startup.Configure中通过app.UseSignalR方法对Hub路由进行配置

代码解析

微软官方示范(https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-2.1&tabs=visual-studio)中的ChatHub:

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks; namespace SignalRChat.Hubs
{
   public class ChatHub : Hub
   {
       //服务端方法
       public async Task SendMessage(string user, string message)
       {
           //ReceiveMessage 为客户端方法,让所有客户端调用这个方法
           await Clients.All.SendAsync("ReceiveMessage", user, message);
       }
   }
}

 

上述代码为当收到客户端发来的SendMessage请求后(发送聊天信息),我们把消息发送到所有客户端,让他们调用自身的ReceiveMessage方法。

用户标识

通常情况下,在用户进行连接后,Connection会保存用户的用户标识,以便对特定用户进行发送消息。

可以实现IUserIdProvider来自定义获取用户的方法,例如:

public class CustomUserIdProvider : IUserIdProvider
{
   public virtual string GetUserId(HubConnectionContext connection)
   {
       return connection.User?.FindFirst(ClaimTypes.Email)?.Value;
   }
}

 

在Startup.ConfigureServices中注册:

services.AddSingleton<IUserIdProvider, CustomUserIdProvider>();

  

Client的方法

T All { get; }

相当于持久连接中的 Broadcast。

T AllExcept(params string[] excludeConnectionIds);

给排除本人所有人发送消息。

T Client(string connectionId);

跟Send操作就是一样的了。

T Clients(IList<string> connectionIds);

和Send操作的重载方法一样,可以给一批指定的人发送。

T Group(string groupName, params string[] excludeConnectionIds);

给房间中的指定人发送消息: Clients.Group("room1", "asdfasdfads");

T Groups(IList<string> groupNames, params string[] excludeConnectionIds);

给房间列表中的指定人发送消息; 【天然的聊天室功能】

T User(string userId);

这个和Client是有区别的。 这个userId => this.Context.Request.User.Identity.Name 【form验证】

cookie中间件来做到singlar的身份验证。

  userId 是你自己定义的一个标识。

T Users(IList<string> userIds);

客户端JS使用方法

<script src="~/lib/signalr/signalr.js"></script>
<script type="text/javascript">
const connection = new signalR.HubConnectionBuilder()
.withUrl("/myChatHub")
.configureLogging(signalR.LogLevel.Information)
.build();
connection.start().catch(err => console.error(err.toString()));
//定义方法使用connection.on方法来接收返回数据
connection.on("SendMessage", (user, message) => {
const encodedMsg = user + " 说:" + message;
const li = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li);
}); document.getElementById("sendBtn").addEventListener("click", function () {
var user = document.getElementById('userName').value;
var message = document.getElementById('message').value;
//从客户端中调用在此调用之前在自定义Hub定义的SendMessage方法
connection.invoke("SendMessage", user, message).catch(err => console.error(err.toString()));
document.getElementById('message').value = "";
});
</script>

  

ASP.NET Core SignalR的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. ASP.NET Core SignalR 使用

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

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

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

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

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

  9. ASP.NET Core SignalR CORS 跨域问题

    将 SignalR 集成到 ASP.NET Core api 程序的时候,按照官方 DEMO 配置完成,本地访问没有问题,但是发布之后一直报跨域问题,本地是这样设置的: 原始代码: services. ...

随机推荐

  1. Less 编译生成 css

    开发模式下使用less.js <link rel="stylesheet/less" type="text/css" href="~/Conte ...

  2. 牛客练习赛36B

    唔在cf上做过,A题也做过,神仙说D题也是原题 这个题就是dp了.然后数组滚动一下,很显然能住遇到  i 只与 i-1 有关,所以还是挺好滚的. dp[i][j][k]表示到第I 天一共工作了J天连续 ...

  3. oracle xe 创建表空间

    使用OracleXE控制台,我们会发现一个奇怪的现象:没有提供创建表空间.增加数据文件等功能.这似乎和我们使用Oracle标准版控制台不一样. 其实在OracleXE中可以创建新的表空间,不过一般情况 ...

  4. eclipse哪个版本好

    Eclipse IDE for Java EE Developers (企业级开发软件,干啥都足够了,300MB左右)

  5. VS2013 Ctrl+Shift+F 没反应

    快捷键设定与搜狗输入法中文繁体切换冲突,搜狗输入法管理设置中关掉就好.

  6. MySQL数据库导出

    因为业务需要,把MySQL查询的数据导出成csv文件,操作在Navicat中完成. 首选用SELECT语句查询数据,然后Navicat的导出,然后选csv,选路径,再加上首栏就可以了

  7. INFO Dispatcher:42 - Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir

    INFO Dispatcher:42 - Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax ...

  8. mysql5.7.17安装配置图文教程

    My SQL的特点: MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,M ...

  9. 1.7Oob 方法重载和成员变量,局部变量,构造方法

    1:方法调用,如果值有参方法,必须传递实际参数. 2:方法定义了多少个参数,传递的实际参数就 必须有多少个, 方法的作用:1:描述某个类的作用,2:软件的复用 这个复用率低,作用小,价值很低: 3:

  10. SQL Server 索引自动组织维护

    公司的一个产品中的数据库,几个热点表因为主键和索引设计不合理,造成索引碎片过大,影响性能. 我尝试新建了一个索引碎片整理的定时任务,用于维护索引锁片和统计信息. 具体的过程如下: 本文原创,转发请表明 ...