1.添加 SignalR 客户端库

右键点击项目->然后选择“添加” >“客户端库”

提供程序选择:unpkg ,库选择:@aspnet/signalr@1.1.4

选择“选择特定文件” ,展开“dist/browser” 文件夹,然后选择“signalr.js” 和“signalr.min.js”

选择指定位置安装即可

2.定义Hub集线器

创建MessageHub 并继承Hub。Hub类管理连接、组和消息

using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR; namespace NetCoreWebApi.SignalR
{
/// <summary>
/// Message集线器
/// </summary>
public class MessageHub : Hub
{
/// <summary>
/// 存放已连接信息
/// </summary>
public static readonly Dictionary<string, string> Connections = new Dictionary<string, string>();
/// <summary>
/// 发送消息
/// </summary>
/// <param name="loginNo"></param>
/// <param name="message"></param>
/// <returns></returns>
public async Task SendMessage(string loginNo, string message)
{
Connections.TryGetValue(loginNo, out string clientId);
//ReceiveMessage 客户端接受方法
await Clients.Client(clientId).SendAsync("ReceiveMessage", message);
}
/// <summary>
/// 客户端登录成功保存用户账号和客户端Id
/// </summary>
/// <param name="loginNo"></param>
public void SendLogin(string loginNo)
{
//判断用户有没有登陆过(没登陆过插入用户名和Id,登陆过修改用户名和Id)
if (!Connections.ContainsKey(loginNo))
{
Connections.Add(loginNo, Context.ConnectionId);
}
else
{
Connections[loginNo] = Context.ConnectionId;
}
}
}
}

3.配置SignalR

我们需要在Startup.cs启动类的ConfigureServices中注册SignalR服务

            services.AddSignalR();

设置SignalR路由

            //设置SignalR路由,指向自定义类MessageHub
app.UseSignalR(route =>
{
route.MapHub<MessageHub>("/MessageHub");
});

注意:UseSignalR 必须在 UseMvc 之前调用!

4.编写SignalR 客户端代码

引用signalr.js类库文件到html中

在 on 后对 HubConnection  调用 start 方法。这样做可确保在收到消息之前注册处理程序。

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<div style="text-align: center;margin-top: 5%">
<input type="text" id="message" placeholder="消息" />
<button type="button" id="sendBtn">发送</button>
</div>
<script src="../Resources/lib/signalr/dist/browser/signalr.js"></script>
</body>
</html>
<script>
var connection = new signalR.HubConnectionBuilder()
//配置路由
.withUrl("/MessageHub")
//日志信息
.configureLogging(signalR.LogLevel.Information)
//创建
.build();
//接受消息
connection.on("ReceiveMessage", (message) => {
alert("收到消息===>" + message);
});
//发送消息
document.getElementById("sendBtn").addEventListener("click", function () {
var message = document.getElementById('message').value;
connection.invoke("SendMessage", "tenghao510@qq.com", message).catch(err =>
console.error(err.toString())
);
});
//开始连接
connection.start().then(e => {
connection.invoke("SendLogin", "tenghao510@qq.com").catch(err =>
console.error(err.toString())
);
}).catch(err => console.error(err.toString()));
</script>

5.运行程序

打开html页面,F12在 Console 看到打印以下信息说明连接成功。

输入文字,点击发送按钮。(我这里是alert,如有其它需求,可在接收消息回调里面处理逻辑)

6.从控制器发布消息

将消息从外部发送到 hub。当使用控制器时,需要注入一个 IHubContext 实例。

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using NetCoreWebApi.SignalR; namespace NetCoreWebApi.Controllers
{
/// <summary>
/// SignalR推送
/// </summary>
[Route("api/hub")]
[ApiController]
public class HubController : Controller
{
private readonly IHubContext<MessageHub> _hubContext;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="hubClients"></param>
public HubController(IHubContext<MessageHub> hubClients)
{
_hubContext = hubClients;
}
/// <summary>
/// 测试SignalR推送
/// </summary>
/// <param name="loginNo"></param>
[HttpGet]
[Route("pushMsg")]
public void PushMsg(string loginNo)
{
if (string.IsNullOrWhiteSpace(loginNo))
{
//给所有人推送消息
_hubContext.Clients.All.SendAsync("ReceiveMessage", "这是控制器发送的消息");
}
else
{
//给指定人推送
MessageHub.Connections.TryGetValue(loginNo, out string id);
_hubContext.Clients.Client(id).SendAsync("ReceiveMessage", "这是控制器发送的消息");
}
}
}
}

调用接口测试

ASP.NET Core 2.2 WebApi 系列【九】使用SignalR的更多相关文章

  1. ASP.NET Core 2.2 WebApi 系列【九】使用SignalR (作者:tenghao510 ) 学习及内容补充

    原文地址:  ASP.NET Core 2.2 WebApi 系列[九]使用SignalR 今天,看到了大牛的这篇博文,  发了一下评论, 我很惊喜, 没想到他很快就回复了我,  而且通过QQ帮助了S ...

  2. ASP.NET Core 3.0 WebApi 系列【1】创建ASP.NET Core WebApi 项目

    目录 写在前面 一.运行环境 二.项目搭建 三.测试 API 四.基础知识 五.写在最后 写在前面 C#语言可以创建RESTful服务,被称作WebApi.在这里总结学习使用支持创建.读取.更新.删除 ...

  3. ASP.NET Core 2.2 WebApi 系列【一】搭建ASP.NET Core WebApi项目

    一.步骤 从“文件”菜单中选择“新建”>“项目” . 选择“ASP.NET Core Web 应用程序”模板,再单击“下一步” . 将项目命名为 NetCoreWebApi,然后单击“创建” . ...

  4. ASP.NET Core 3.0 WebApi 系列【2】.Net Core 3.0+ CodeFirst + MySql 实现数据的迁移

    写在前面 在前一小节中,我们创建了基于RESFULL风格的服务.这个小节,尝试使用CodeFirst+MySql 的方式实现数据迁移. 一.开发环境 [1]运行环境:win10 家庭版 [2]开发工具 ...

  5. ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)

    现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...

  6. ASP.NET Core 2.2 WebApi 系列【七】泛型仓储模式和工作单元

    在之前的泛型仓储模式实现中,每个增删改都调用了SaveChanges方法,导致每次更新都提交了事务. 在实际开发过程中,我们经常遇到同时操作多张表数据,那么按照之前的写法,对数据库提交了多次操作,开启 ...

  7. ASP.NET Core 2.2 WebApi 系列【六】泛型仓储模式

    为什么要使用泛型仓储?好处是? 前两章在autofac注入的时候,用的User类作为例子,写了增删改查四个接口,也就是仓储的GRUD. 当我们再添加一个实体(比如Student)时,StudentRe ...

  8. ASP.NET Core 2.2 WebApi 系列【五】MiniProfiler与Swagger集成

    MiniProfiler 是一款性能分析的轻量级程序,可以基于action(request)记录每个阶段的耗时时长,还是可以显示访问数据库时的SQL(支持EF.EF Code First)等 一.安装 ...

  9. ASP.NET Core 2.2 WebApi 系列【四】集成Swagger

    Swagger 是一款自动生成在线接口文档+功能测试功能软件 一.安装程序包 通过管理 NuGet 程序包安装,搜索Swashbuckle.AspNetCore 二.配置 Swagger 将 Swag ...

随机推荐

  1. java8-从Lamda到方法引用和构造引用

    一方法引用概述 经过前面2章Lamda原理引入和Lamda解析,基本就会熟练使用Lamda表达式,这次我们更深入点.来了解一下方法引用. 方法引用是特定Lamda表达式的一种简写,其思路就是能替换La ...

  2. python 正则表达式re使用模块(match()、search()和compile())

    摘录 python核心编程 python的re模块允许多线程共享一个已编译的正则表达式对象,也支持命名子组.下表是常见的正则表达式属性: 函数/方法 描述 仅仅是re模块函数 compile(patt ...

  3. MongoDB(六):选择字段、限制记录数、排序记录

    1. 选择字段 在MongoDB中,选择字段又叫投影,表示仅选择所需要字段的数据,而不是选择整个文档字段的数据.如果某个文档有5个字段,但只要显示3个字段,那么就只选择3个字段吧,这样做是非常有好处的 ...

  4. jquery实现商品sku多属性选择(商品详情页)

    转载于https://blog.csdn.net/csdn924618338/article/details/51455595 实现效果 源码 <!DOCTYPE HTML> <ht ...

  5. java月考题JSD1908第二次月考(含答案和解析)

    考试 .container { clear: both; margin: 0 auto; text-align: left; /*width: 1200px;*/ } .container:after ...

  6. linux 用户,组

    权限: 所谓的权限是,由用户启动的进程,或者由操作系统启动的进程,可以访问哪些文件,不可以访问哪些文件. 进程太多了,不可能为每个进程定义权限对吧,所以进程的权限来自于启动进程的用户. 用户有哪些权限 ...

  7. java之动态代理设计模式

    代理:专门完成代理请求的操作类,是所有动态代理类的父类,通过此类为一个或多个接口动态地生成实现类. 弄清动态代理的关键是清楚java的反射机制,在https://www.cnblogs.com/xix ...

  8. mysql主从同步问题梳理

    前言: MySQL主从复制故障机延迟原因有很多,之前详细介绍了Mysql主从复制的原理和部署过程,在mysql同步过程中会出现很多问题,导致数据同步异常.以下梳理了几种主从同步中可能存在的问题: 1) ...

  9. CEF编译 执行gn args out\Release_GN_x86异常

    gn args out\Debug_GN_x86 用来配置编译参数,执行gn args out\Release_GN_x86时异常: Toolchain is out of date. Run &qu ...

  10. 好的js书写习惯

    1:单一判断 bad if (result) { console.log("秋叶"); } if (!result) { console.log("秋叶"); ...