使用 .NET Core 7 和 SignalR 构建实时聊天应用程序

动动你可爱的小手,请关注下本人公众号,继续为您提供更多原创技术文章。谢谢给为的支持

SignalR 是一个 ASP.NET 库,它支持实时 Web 功能,允许服务器立即将更新推送到客户端,从而提高应用程序的效率和响应能力。它通过简化通信和支持各种传输协议,对于聊天应用程序、实时仪表板和协作工具中的即时更新非常有用。实时通信可以提高用户参与度,减少资源密集型轮询,并且对于在线游戏和金融交易平台等交互式应用程序至关重要,可提供无缝和动态的用户体验。

本文将介绍如何使用 .Net Core 7 和 SignalR 构建实时聊天应用程序。

什么是 SignalR?

  • SignalR 是一个支持实时 Web 功能的 ASP.NET 库。SignalR 使用 WebSockets 在服务器和客户端之间建立持久连接(如果可用)。如果 WebSockets 不可用,SignalR 将依赖其他合适的传输协议(如服务器发送事件或长轮询)来确保广泛的兼容性。

  • SignalR 功能的基础基于“Hubs”,它们是高级管道 API,使服务器能够在连接的客户端上调用方法,反之亦然。开发人员创建 Hub 类,其中包含可由客户端调用的方法。然后,客户端使用 JavaScript 调用这些方法,SignalR 处理通信详细信息。

  • SignalR 支持对连接进行分组,这允许将消息发送到已连接客户端的特定子集。这对于聊天室等场景非常有用,因为只有某些用户应该接收特定消息。

  • SignalR 控制连接生命周期,并在连接丢失时自动处理重新连接。这可确保服务器和客户端可靠地通信,而无需强迫开发人员执行任何额外操作。

  • 服务器可以使用 SignalR 提供的技术自动将更新推送到客户端。因此,客户端可以更有效地进行实时通信,并减轻服务器负担,而无需向服务器查询更新。

使用 .NET Core 7 和 SignalR 创建实时聊天应用程序的步骤

第 1 步:设置项目

  • 让我们从创建一个新的 ASP.NET Core 7 项目开始。在 Visual Studio 中,打开后选择“创建新项目”。为项目命名,然后选择“ASP.NET Core Web Application”作为项目类型。

  • 接下来,选择项目模板“Web Application”并确保未选中“Enable Docker Support”。要开始创建项目,请单击“创建”。

Dotnet 项目设置

  • 创建项目后打开“Program.cs”文件,然后添加以下代码以添加 SignalR:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>
builder.Services.AddSignalR();
builder.Services.AddControllersWithViews();

</code></span></span>
  • 现在,将 SignalR 客户端库添加到我们的项目中。

  • 在“解决方案资源管理器”中,右键单击项目,然后选择“添加>客户端库”。

添加客户端库

  • 在 Add Client-Side Library 对话框中:
  1. 为 Provider 选择 unpkg。
  2. 输入 @microsoft/signalr@latest 作为库。
  3. 选择 Choose specific files(选择特定文件),展开 dist/browser 文件夹,然后选择 signalr.js 和 signalr.min.js。
  4. 将 目标位置 设置为 wwwroot/js/signalr/。
  5. 选择 Install (安装)。

客户端库

第 2 步:创建 Hub

  • 创建一个名为 Hubs 的文件夹。
  • 要创建新文件夹,请右键单击解决方案,然后单击添加,然后单击添加文件夹。(添加>添加文件夹)。

枢纽

  • 将此新创建的重命名为 Hubs。
  • 客户端和服务器之间的每个实时通信都将通过 Hub 进行管理。在我们项目的 “Hubs” 文件夹中,让我们构建一个名为 “ChatHub” 的新类。

添加集线器

flood 类替换为以下代码:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

namespace YourProjectName.Hubs
{
    public class ChatHub : Hub
    {
        public async Task Message(string user, string message)
        {
            await Clients.All.SendAsync("ReceiveMessage", user, message);
            //this will be listen by client using javascript.
        }
    }
}
</code></span></span>
  • 这将创建从 SignalR Hub 继承的新 Hub 类。我们定义了名为 Message 的方法,它接受两个字符串参数 user 和 message ,SendAsync 方法将消息发送到所有连接的客户端。

  • 但是,在使用 ChatHub 之前,我们必须在 Program.cs 中对其进行配置

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>//...
app.MapHub<ChatHub>("chatHub");
//...
</code></span></span>

注意:此行通过将“/chatHub”URL 映射到 ChatHub 类,将 SignalR 中间件配置为使用聊天中心。

第 3 步:创建 UI

  • 实现 Chat Hub 后,我们仍然需要为我们的聊天程序设计用户界面 (UI)。为了在本教程中进行实时通信,将使用带有一些 JavaScript 代码的基本 HTML 页面。

主 UI 页面

将以下代码添加到项目的“index.cshtml”文件中:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>@{
Layout = null;
}
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>
        SignalR Chat
    </title>
    <script src=
"https://code.jquery.com/jquery-3.6.0.min.js">
    </script>
    <script src=
"https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/5.0.13/signalr.min.js">
    </script>
</head>

<body>
    <div>
        <input id="username" placeholder="username" 
               type="text" />
        <input id="message" placeholder="message"
               type="text" />
        <button id="send-btn">
            Send
        </button>
    </div>
    <div id="chatBox">
    </div>
    <script>
        let connection = new signalR.HubConnectionBuilder()
                                    .withUrl("/chatHub").build();
        connection.on("ReceiveMessage", function (User, Message) {
            let encodedUser = $("<div />").text(user).html();
            let encodedMsg = $("<div />").text(message).html();
            $("#chatBox").append("<p><strong>" + encodedUser + "</strong>: " + encodedMsg + "</p>");
        });

        $("#send-btn").click(function () {
            let our_user = $("#username").val();
            let Message = $("#message").val();
            connection.invoke("Message", our_user, Message);
            $("#message").val("").focus();
        });


        connection.start().then(function () {
            console.log("Connected!");
        }).catch(function (err) {
            console.error(err.toString());
        });
    </script>
</body>

</html>
</code></span></span>

注意:此代码生成一个简单的用户界面 (UI),其中包含一个 “Send” 按钮、一个消息输入表单和一个用户名字段。此外,还会创建一个 ID 为“chatBox”的 div,这是显示聊天消息的位置。

  • 使用 URL“/chatHub”(我们在“Startup.cs”文件中映射到 ChatHub 类),我们在 JavaScript 代码中建立新的 SignalR 连接。每次将消息从服务器发送到客户端时触发的 “ReceiveMessage” 事件,然后由我们定义的函数处理。该消息使用此函数附加到 chatBox div 中。

  • 此外,我们为 “Send” 按钮构造了一个 click 事件处理程序,该处理程序使用 “Message” 方法将用户名和消息发送到服务器。最后,我们启动 SignalR 连接,并在建立连接后向控制台记录一条消息。

第 4 步:运行应用程序

  • 现在是启动应用程序的时候了 要在调试模式下启动程序,请按 F5。应用程序启动后,您应该能够查看带有输入字段和“发送”按钮的聊天 UI。
  • 输入您的姓名和消息后,单击“发送”。您的消息将在聊天窗口中弹出。导航到其他浏览器窗口中的同一 URL。发送消息并输入其他名称。该消息将出现在两个窗口中。

使用 dotnet 和 signalR 的实时聊天应用

恭喜,您刚刚使用 .NET Core 7 和 SignalR 构建了一个实时聊天应用程序!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧社区可视化解决方案:科技引领社区服务与管理新篇章

随着社会的发展&#xff0c;智慧社区作为新型城镇化发展目标和社区服务体系建设的重要举措&#xff0c;正逐步改变着我们的生活方式。智慧社区通过综合运用现代科学技术&#xff0c;整合区域资源&#xff0c;提升社区治理和服务水平&#xff0c;为居民提供更为便捷、高效、安全…

Unicode字符集(万国码)

1.三种编码方式&#xff1a; UTF-16&#xff1a;16个bit位&#xff08;2个字节&#xff09;存储 UTF-32&#xff1a;32个bit位&#xff08;4个字节&#xff09;存储 UTF-8&#xff1a;可变长度字符编码。1-4个字节存储&#xff0c;只需记住&#xff1a;英文字母1个字节表示&…

excel功能

统计excel中每个名字出现的次数 在Excel中统计每个名字出现的次数&#xff0c;您可以使用COUNTIF函数或数据透视表。以下是两种方法的详细步骤&#xff1a; 方法一&#xff1a;使用COUNTIF函数 准备数据&#xff1a;确保您的姓名列表位于一个连续的单元格区域&#xff0c;例如…

A025-基于SpringBoot的售楼管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

nginx 部署2个相同的vue

起因&#xff1a; 最近遇到一个问题&#xff0c;在前端用nginx 部署 vue&#xff0c; 发现如果前端有改动&#xff0c;如果不适用热更新&#xff0c;而是直接复制项目过去&#xff0c;会404 因此想到用nginx 负载两套相同vue项目&#xff0c;然后一个个复制vue项目就可以了。…

微服务day06

MQ入门 同步处理业务&#xff1a; 异步处理&#xff1a; 将任务处理后交给MQ来进行分发处理。 MQ的相关知识 同步调用 同步调用的小结 异步调用 MQ技术选型 RabbitMQ 安装部署 其中包含几个概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 …

GIT:如何查找已删除的文件的历史记录

首先你得知道文件的名称和路径 然后打开 gitlab&#xff0c;到项目中&#xff0c;仓库-> 文件 查找文件 复制文件名到可能存在过这个文件的分支当中&#xff0c;就能看到了

PSINS工具箱,MATLAB例程,仅以速度为观测量的SINS/GNSS组合导航(滤波方式为EKF)

基于【PSINS工具箱】&#xff0c;提供一个MATLAB例程&#xff0c;仅以速度为观测量的SINS/GNSS组合导航&#xff08;滤波方式为EKF&#xff09; 文章目录 工具箱程序简述运行结果 代码程序讲解MATLAB 代码讲解&#xff1a;速度观测的 EKF 实现代码结构与功能EKF滤波过程结果处理…

hypermesh看模型内部

点击快捷键F5&#xff08;跳跃到mask部分&#xff09; 旋转即可

物品租赁+加盟系统+押金原路返回系统+酒店系统-一体化

一加盟商管理 二、加盟店押金管理 三、押金收银台 四、退押金 五、物品租赁系统领取 公众《未来之窗软件服务中心》 六、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技术共享的浪潮中&#xff0c;不仅…

京韵作序 极见东方 玛格·极北京艺术旗舰店盛大开业

你好北京&#xff0c;问鼎高定 以极为信仰&#xff0c;坚持极致美学追求 在登峰造极的路上不断探索 玛格极大宅全案定制&#xff0c;耀启京城 实现人们对美好生活的向往 11月10日&#xff0c;玛格极北京艺术旗舰店在红星美凯龙全球家居1号店华丽亮相&#xff0c;来自家居行…

CSS如何改变滚动条的颜色样式粗细?

默认滚动条很丑怎么办&#xff1f;如何改版滚动条的粗细&#xff0c;颜色&#xff0c;让它更美观&#xff1f;CSS如何改变滚动条的粗细&#xff1f; 干货来了 /* Webkit内核浏览器的滚动条样式 */ ::-webkit-scrollbar {width: 4px; /* 设置滚动条的宽度 */ }::-webkit-scroll…

使用GPT-SoVITS训练语音模型

1.项目演示 阅读单句话 1725352713141 读古诗 1725353700203 2.项目环境 开发环境&#xff1a;linux 机器配置如下&#xff1a;实际使用率百分之二十几&#xff0c; 3.开发步骤 1.首先是准备数据集&#xff0c;要求是wav格式&#xff0c;一到两个小时即可&#xff0c; 2.…

AI生活之我用AI处理Excel表格

AI生活之我用AI处理Excel表格 场景再现AI提问词AI代码运行调试结果心得感受 场景再现 因学习需要&#xff0c;整理了某个题库&#xff0c;方便自己刷题使用。 已将每套题打上了制定标签&#xff0c;得到一个Excel表格。截图如下&#xff1a; 需求是&#xff1a;一共35套题&…

PySpark本地开发环境搭建

一.前置事项 请注意&#xff0c;需要先实现Windows的本地JDK和Hadoop的安装。 二.windows安装Anaconda 资源&#xff1a;Miniconda3-py38-4.11.0-Windows-x86-64&#xff0c;在window使用的Anaconda资源-CSDN文库 右键以管理员身份运行&#xff0c;选择你的安装路径&#x…

virtualBox安装拓展包extension pack失败的超级详细解决办法

virtualBox安装拓展包extension pack时&#xff0c;网上的博主们都说直接进官网下载包&#xff0c;安装就行。下载网站是 https://www.virtualbox.org/wiki/Downloads 但是&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 默认下载的是最新版本的包&#xff0c…

基于标签相关性的多标签学习

基于标签相关性的多标签学习 论文概述什么是多标签学习论文贡献 算法流程挖掘“主题“——提取标签相关性训练 M T M_T MT​模型——拟合{特征集, 主题集合}用标记相关性扩增数据集再次训练拟合 M M M模型——对真实帕金森病例进行筛查 实验结果核心代码复现main.py文件multi_l…

阿里公告:停止 EasyExcel 更新与维护

最近&#xff0c;阿里发布公告通知&#xff0c;将停止对知名 Java Excel 工具库 EasyExcel 的更新和维护。EasyExcel 由阿里巴巴开源&#xff0c;作者是玉箫&#xff0c;在 GitHub 上拥有 30k stars、7.5k forks 的高人气。 据悉&#xff0c;EasyExcel 作者玉箫去年已从阿里离…

稳恒磁场(2)

物理概念 电流元 IdL要足够小 物理理论 毕奥——萨伐尔定律 电流元在空间产生的磁场&#xff0c;磁感应强度与电流I长正比&#xff0c;与半径的平方成反比 后由拉普拉斯总结得出数学表达式&#xff1a; 其中 &#xff0c;μ0 4π*10^-7 N*A^-2 &#xff0c; r^为r反向上…

C语言 | Leetcode C语言题解之第553题最优除法

题目&#xff1a; 题解&#xff1a; #define MAX_STR_LEN 64char * optimalDivision(int* nums, int numsSize) {char * res (char *)malloc(sizeof(char) * MAX_STR_LEN);if (numsSize 1) {sprintf(res, "%d", nums[0]);return res;}if (numsSize 2) {sprintf(r…