ASP.NET Core SignalR 构建高效实时通信应用

news2024/9/20 1:13:06

目录

前言

SignalR的基本概念及其工作原理

1、核心概念

2、工作原理

前端环境准备

1、安装SignalR

2、创建SignalR连接

3、设置自动重新连接

4、监听连接状态

5、初始化连接

后端环境准备

1、注册SignalR

2、设置Hub

3、配置路由

4、发送和接收消息

实现聊天应用等典型场景

1、发送和接收消息

2、断开连接后的自动重连

总结


前言

在平时开发中遇到实时网络请求时,传统的轮询方式已经无法满足对于延迟和性能的要求。ASP.NET Core SignalR 作为一种强大的实时通信框架,使得在服务器和客户端之间建立持久连接变得更加简单快捷。

它不仅减少了开发实时功能的复杂度,还极大地提升了用户体验。

本文将介绍如何利用ASP.NET Core SignalR构建高效、可扩展的实时应用程序。我们将从SignalR的基本概念入手,逐步深入到其内部机制及应用场景,并通过一个实际的示例项目来展示如何快速搭建一个具备实时通信能力的应用。

SignalR的基本概念及其工作原理

ASP.NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信。

1、核心概念

Hub:Hub是SignalR的核心组件之一,它充当了服务器端与客户端之间的通信桥梁。Hub定义了一系列方法,这些方法可以被客户端调用,也可以由服务器端调用并向客户端发送消息。

客户端:客户端是指与Hub进行交互的应用程序,可以是浏览器中的JavaScript脚本、移动应用或其他任何可以与SignalR服务器通信的客户端。

服务器:服务器端负责创建Hub实例,并处理客户端的请求。

2、工作原理

SignalR使用多种传输协议来实现客户端与服务器之间的双向通信,包括WebSocket、Server-Sent Events (SSE)、Long Polling等。

这些协议的选择取决于客户端的支持情况和网络环境。

前端环境准备

首先,确保Vue.js项目已经创建完成。

如果你还没有创建项目,可以使用Vue CLI或其他你喜欢的方式创建一个新的Vue.js项目。

1、安装SignalR

在Vue.js项目中使用SignalR之前,你需要先安装@microsoft/signalr包。打开终端并进入你的Vue.js项目的根目录。

然后运行以下命令来安装SignalR包:

npm install @microsoft/signalr

安装完成后,可以在Vue组件中导入SignalR:

import * as signalR from "@microsoft/signalr";
2、创建SignalR连接

为了创建一个SignalR连接,你需要定义一个HubConnectionBuilder实例,并指定服务器的URL。此外,你还需要配置自动重连策略。

3、设置自动重新连接

你可以通过调用withAutomaticReconnect方法来设置自动重连。该方法接受一个包含重试间隔时间的数组作为参数。例如,以下代码设置了第一次尝试立即重连,随后的尝试分别等待2秒、4秒和6秒:

const connection = new signalR.HubConnectionBuilder()
    .withUrl("https://yourserver.com/hub")
    .withAutomaticReconnect([0, 2000, 4000, 6000])
    .build();
4、监听连接状态

SignalR提供了几个事件监听器来监控连接的状态变化:

  • onreconnecting: 当连接断开时被触发。

  • onreconnected: 当连接重新建立时被触发。

  • onclose: 当所有重连尝试都失败时被触发。

示例代码

connection.onreconnecting(() => {
    console.log('Connection is reconnecting...');
3});
​
5connection.onreconnected(() => {
    console.log('Connection was reconnected!');
});
​
connection.onclose(() => {
    console.log('All reconnection attempts failed. Starting to reinitialize the connection.');
    // 重新初始化连接
    setTimeout(() => {
        initializeConnection();
    }, 10000); // 10秒后重新初始化
});
5、初始化连接

在初始化连接时,你可能需要处理初始化失败的情况。你可以通过监听onclose事件并在其中重新初始化连接来实现这一点。

示例代码

function initializeConnection() {
    try {
        connection.start().catch(err => {
            console.error(err);
            // 如果初始化失败,则在5秒后再次尝试
            setTimeout(initializeConnection, 5000);
        });
    } catch (err) {
        console.error(err);
    }
}
initializeConnection();

后端环境准备

在ASP.NET Core后端项目中,你需要设置SignalR Hub以便与前端通信。

1、注册SignalR

在Startup.cs文件中注册SignalR服务:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR();
}
2、设置Hub

创建一个Hub类来处理客户端的连接和消息传递:

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}
3、配置路由

在Configure方法中配置SignalR的路由:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
​
    app.UseRouting();
​
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chatHub");
        endpoints.MapControllers();
    });
}
4、发送和接收消息

在Vue.js中,你可以通过调用invoke方法来发送消息,并通过注册事件处理器来接收消息。

// 发送消息
connection.invoke('SendMessage', 'User', 'Hello!').catch(err => console.error(err));
​
// 接收消息
connection.on('ReceiveMessage', (user, message) => {
    console.log(`${user} says: ${message}`);
7});

实现聊天应用等典型场景

1、发送和接收消息

发送消息:客户端可以通过调用invoke方法向服务器发送消息:

connection.invoke('SendMessage', 'User', 'Hello!').catch(err => console.error(err));

接收消息:服务器端通过调用Clients.All.SendAsync方法向所有客户端发送消息:

public async Task SendMessage(string user, string message)
{
    await Clients.All.SendAsync("ReceiveMessage", user, message);
}
2、断开连接后的自动重连

自动重连:通过withAutomaticReconnect方法设置自动重连策略。

重连失败后的处理:在onclose事件中处理所有重连尝试失败的情况,并重新初始化连接。

总结

本文介绍了如何利用ASP.NET Core SignalR构建高效、可扩展的实时应用程序。我们从SignalR的基本概念入手,逐步深入到其内部机制及应用场景,并通过一个实际的示例项目展示了如何快速搭建一个具备实时通信能力的应用。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!优秀是一种习惯,欢迎大家关注学习 !优秀是一种习惯,欢迎大家关注学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GraphRAG层级多标签文本分类任务实战(1)

1.概述 GraphRAG的本质是调用LLM生成知识图谱&#xff0c;然后在回答问题时检索相关内容输到prompt里&#xff0c;作为补充知识来辅助回答。那么有没有可能将这运用到层级多标签文本分类&#xff08;HMTC)任务中呢&#xff1f; 当然&#xff0c;乍一听有一点天方夜谭&#xf…

3 pytest Fixture

目录 3.1 通过 conftest.py 共享 fixture3.2 使用 fixture 执行配置及销毁逻辑3.3 使用 --setup-show 回溯 fixture 的执行过程3.4 使用 fixture 传递测试数据3.5 使用多个 fixture3.6 指定 fixture 作用范围3.7 使用 usefixtures 指定 fixture3.8 为常用 fixture 添加 autouse…

vue开发区分开发环境和生产环境,以及预发布环境

vue开发区分开发环境和生产环境&#xff0c;以及预发布环境 在根目录创建 .env[mode] 文件&#xff0c;在项目执行 npm run dev 的时候vite会自动去读取.env.development文件里面的配置&#xff0c;执行npm runbuild进行打包之后也会自动将.env.production的内容打包进去&…

MyBatis使用:拦截器,SpringBoot整合MyBatis

1、目标 本文的主要目标是学习使用MyBatis拦截器&#xff0c;并给出拦截器的实例 2、拦截器的使用 2.1 Intercepts注解和Signature注解 Intercepts注解&#xff0c;指定拦截哪个拦截器的哪个方法&#xff0c;还要指定参数&#xff0c;因为可能发生方法重载 按照顺序可以拦…

人脸识别签到系统

人脸识别签到系统是一种利用计算机视觉技术和生物识别技术自动识别个体面部特征并进行身份验证的应用系统。这种系统通常应用于需要快速且准确的身份验证场景&#xff0c;例如公司员工打卡、学校上课签到、大型活动入场等。下面是对该系统的详细介绍&#xff1a; 项目背景及目…

【硬件模块】LCD1602显示模块

LCD液晶显示模块实物图 字符型液晶显示模块&#xff0c;可显示16列2行&#xff0c;共32个字符&#xff0c;每个字符都由5x8像素点阵构成。 常见型号&#xff1a;1602&#xff08;16列2行&#xff09;&#xff1b;2004&#xff08;20列4行&#xff09;&#xff1b;12864&#xf…

不用下载!玩《黑神话·悟空》图文教程by无影云电脑,开机即玩

使用阿里云无影云电脑畅玩《黑神话悟空》游戏图文教程&#xff0c;不需要下载&#xff0c;超简单开机即玩。无影云电脑提供WeGame版镜像和Steam版镜像&#xff0c;开机就能玩。阿小云分享阿里云官方发布的用无影云电脑畅玩《黑神话悟空》游戏图文教程&#xff1a; 无影云电脑玩…

笔记本电脑数据恢复的最佳解决方案 - 100%快速和安全

到目前为止&#xff0c;数字设备已成为我们生活中不可或缺的一部分。电脑、手机和数码相机丰富了我们的生活&#xff0c;给我们带来了很多便利。近年来&#xff0c;笔记本电脑越来越受到人们的欢迎&#xff0c;主要是因为它相对较轻且易于携带。 但是&#xff0c;如果笔记本电脑…

C++必修:set/map,mutiset/mutimap的用法

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. set的介绍 在 C 中&#xff0c;set 是一种关联容器&#xff0c;用于存储唯一的…

JavaScript初级——DOM查询的其他方法

1、在document中有一个属性 body &#xff0c;保存的是body的引用。 2、document.documentElement 保存的是 html 根标签。 3、document.all 代表页面中所有的元素。 4、根据元素的 class 属性值查询一组元素节点对象 getElementsByClassName&#xff08;&#xff09;可以根…

c++中的const权限及static成员

c中的const权限 void Print() {cout << _year << "-" << _mouth << "-" << _day << endl; } void f(const Date& d) {d.Print(); } this指针为非const的&#xff0c;故需要 //void Print(const Date* this) voi…

【机器学习】数据预处理、特征缩放以及有偏分布的基本概念

引言 数据预处理是机器学习过程中的一个关键步骤&#xff0c;它涉及对原始数据进行清洗、转换和重塑&#xff0c;以提高模型的性能和准确性 文章目录 引言一、数据预处理1.1 定义1.2 步骤1.2.1 数据清洗1.2.2 数据转换1.2.3 数据重塑1.2.4 数据分割1.2.5 数据增强1.2.6 处理不平…

Java—基础知识总结 ٩(๑❛ᴗ❛๑)۶

目录&#xff1a; 一、Java基础知识 1、Java的语言特性&#xff1a; 2、Java的注释&#xff1a; 3、标识符&#xff1a; 4、关键字&#xff1a; 5、数据类型与变量&#xff1a; 1&#xff09;、常量&#xff1a; 2&#xff09;数据类型&#xff1a; 3&#xff09;、变量…

零基础5分钟上手亚马逊云科技-搭建CDN加速应用访问

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…

标准版v5.4安卓手机小程序扫码核销读取不到核销码的问题

修改这个文件&#xff0c;红色的那块代码替换成绿色的这段代码&#xff0c;然后重新打包上传。 文件地址&#xff1a;template/uni-app/pages/admin/order_cancellation/index.vue let path decodeURIComponent(res.path); self.verify_code path.split(‘code’)[1]; h5…

MTK的ATA工厂PCBA贴片验证测试

1.ATA测试就是PCBA硬件测试,目的如下 在工厂生产过程中,在PCB SMT贴装器件并烧录软件后,需要验证DUT(device under test)板上各个功能模块单元的driver基本功能是否正常,通过测试筛查出贴片异常或元器件物料异常等不良PCBA主板。 2.要进行此测试,MTK官方所要求的条件如下…

【C++】函数模板特化:深度解析与应用场景

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

【25届秋招】Shopee 0825算法岗笔试

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间&#xff1a;2024/08/25 &#x1f504; 输入输出&#xff1a;LeetCode格式 ⏳ 时长&#xff1a;2h 本试卷有10道单选&#xff0c;5道多选&#xff0c;3道编程。 整体难度非常简单&#xff0c;博主20min成功AK&#xff0c;这里只给出编…

Self-attention反向传播和梯度消失计算

文章目录 1、前言2、Self-attention的特点3、为什么是(Q, K, V)三元组4、归一化和放缩4.1、Normalization4.2、Scaled4.3、总结 5、Softmax的梯度变化5.1、Softmax函数的输入分布是如何影响输出的5.2、反向传播的过程中的梯度求导5.3、出现梯度消失现象的原因 6、维度与点积大小…

如何使用ssm实现固定资产管理系统

TOC ssm167固定资产管理系统jsp 绪论 1.1 选题背景 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。计算机软件可以针对不同行业的营业特点以及管理需…