.Net6使用SignalR实现前后端实时通信

这篇具有很好参考价值的文章主要介绍了.Net6使用SignalR实现前后端实时通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码部分

  • 后端代码 (Asp.net core web api,用的.net6)
  • Program.cs

代码运行逻辑:
​1. 通过 WebApplication.CreateBuilder(args) 创建一个 ASP.NET Core 应用程序建造器。
2. 使用 builder.Services.AddControllers() 添加 MVC 控制器服务和 builder.Services.AddSignalR() 添加 SignalR 服务。
3. 注册 Swagger 和 Cors 跨域设置的服务,并添加 ChatHub 类作为单例服务。
4. 通过 builder.Build() 构建应用程序。
5. 在 if (app.Environment.IsDevelopment()) 中使用 Swagger 和 SwaggerUI 中间件,只在当前环境下使用。
6. 使用 app.UseAuthorization() 添加授权中间件。
7. 使用 app.UseRouting() 开启路由功能中间件。
8. 使用 app.UseCors(“CorsSingnalR”) 设置跨域策略,使用名为 “CorsSingnalR” 的策略,允许来自任何来源的访问。
9. 使用 app.MapControllers() 将 MVC 控制器添加到请求处理管道中。
10. 使用 app.MapHub(“/chathub”) 添加 SignalR 路由,并将 ChatHub 类注册为路由,在客户端和服务器之间建立 WebSocket 连接
11. 最后,使用 app.Run() 启动应用程序。

using Microsoft.AspNetCore.SignalR;
using PracticeProjects.Logic;

var builder = WebApplication.CreateBuilder(args); //创建asp.net core程序建造器,这个建造器允许我们配置应用程序的服务和中间件


builder.Services.AddControllers();  //添加mvc控制器服务。用于处理http请求俄响应
builder.Services.AddSignalR();//用来实现实时通信

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddSingleton<ChatHub>();
//跨域设置
builder.Services.AddCors(op =>
{
    op.AddPolicy("CorsSingnalR",
    set =>
    {
        set.SetIsOriginAllowed(origin => true).AllowAnyHeader().AllowAnyMethod().AllowCredentials();
    });
});
var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthorization();

app.UseRouting();//中间件,用于开启路由功能。
app.UseCors("CorsSingnalR");//app.UseRouting(),之后app.UseCors设置跨域策略

app.MapControllers();//将MVC控制器添加到请求处理管道中
app.MapHub<ChatHub>("/chathub");//添加SignalR路由;将SignalR的ChatHub类作为路由,在客户端与服务段建立WebSocket连接

app.Run();//应用程序启动

ChatController.cs

  • List item
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using PracticeProjects.Logic;
using PracticeProjects.Model;

namespace PracticeProjects.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class ChatController : ControllerBase
    {
        private readonly ChatHub _chatHubContext;
        private readonly ILogger<ChatController> _logger;
        public ChatController(ChatHub chatHubContext, ILogger<ChatController> logger)
        {
            _chatHubContext = chatHubContext;
            _logger = logger;
        }

        [Route("api/SendMsg")]
        [HttpPost]

        public async Task<dynamic> SendMessage(ChatModel chat)
        {
            await _chatHubContext.SendMessage(chat);

            return "发送成功";
        }
    }
}

方法类(ChatHub:继成Hub,Hub是SignalR中用于处理客户端与服务端双向通信的关键组件。)

using Microsoft.AspNetCore.SignalR;
using PracticeProjects.Model;

namespace PracticeProjects.Logic
{
    /// <summary>
    /// 消息发送
    /// </summary>
    public class ChatHub : Hub
    {
        public async Task SendMessage(ChatModel chat)
        {
            if(Clients!=null)
                await Clients.All.SendAsync("RecieveMessage", chat.name+":"+chat.content);//第一个参数:调用的客户端函数名,第二个参数:客户端函数的参数
        }
    }
}

Model类(ChatModel):

namespace PracticeProjects.Model
{
    public class ChatModel
    {
        public string? name { get; set; }
        public string? content { get; set; }
    }
}
  • 前端关键部分代码(网上找的代码,用来模拟客户端)
    App.vue
<script setup>
import { ref, reactive, onMounted, onBeforeUnmount } from 'vue';

import { connection, connect, send, disconnect } from './utils/signalr';

const msgInfo = reactive({ name: '张三', content: '' });
const receivemsglist = ref([]);

//发送消息
const sendMsg = async () => {
  await send("SendMessage", msgInfo);//第一个参数:服务端函数名,第二个:函数的参数
}

onMounted(async () => {
  // 建立连接
  connect('http://localhost:5130/chathub'); 

  // 开始连接
  await connection.start();

  // 注册方法(接收服务器推送过来的数据),服务端向客户端发送数据时,使用的方法名为'RecieveMessage'
  connection.on('RecieveMessage', (res) => {
    console.log(`${new Date().toLocaleString()}】:从服务器同步消息成功!`);
    receivemsglist.value.push(res);
  });
});


// 卸载
onBeforeUnmount(() => {
  // 断开连接
  disconnect();
});

</script>

<template>
  <div>
    <a href="https://vitejs.dev" target="_blank">
      <img src="/vite.svg" class="logo" alt="Vite logo" />
    </a>
    <a href="https://vuejs.org/" target="_blank">
      <img src="./assets/vue.svg" class="logo vue" alt="Vue logo" />
    </a>
  </div>
  <!-- <HelloWorld msg="Vite + Vue" /> -->
  <div>
    姓名:<input type="text" v-model="msgInfo.name">
    <br>
    内容:<input type="text" v-model="msgInfo.content">
    <br><button type="button" @click="sendMsg">发送</button>
    <br>
    <table>
      <tr>
        <th>消息列表:</th>
      </tr>
      <tr v-for="(item, i) in receivemsglist" :key="i">
        <td>{{ item }}</td>
      </tr>
    </table>
  </div>
</template>

signalr.js

import * as signalR from '@microsoft/signalr';

//如果需要身份验证
//.withUrl('/messageHub', {accessTokenFactory: () => sessionStorage.getItem('token')})
let connection;

// 建立连接
async function start(url) {
    try {
        connection = new signalR.HubConnectionBuilder()
            .withUrl(url)//跨域需要使用绝对地址
            .configureLogging(signalR.LogLevel.Information)
            .withAutomaticReconnect() // 设置自动重连机制
            .build();
    } catch (err) {
        console.log(err);
        setTimeout(start, 10000);//错误重连
    }
}

// 开始signalr连接
const connect = async (url) => {
    await start(url);
    console.log(`${new Date().toLocaleString()}:SignalR已连接成功!`);
};

// 调用服务端方法 发送消息
async function send(methodName, param) {
    try {
        await connection.invoke(methodName, param);
    } catch (err) { console.error(err); }
}

//断开连接
const disconnect = async () => {
    await connection.stop();
    console.log(`${new Date().toLocaleString()}:SignalR已断开连接!`);
};

export { connection, connect, send, disconnect };

运行测试:

  1. 前后端代码启动
  2. 客户端请求服务端建立websocket连接:
    .Net6使用SignalR实现前后端实时通信,.net
  3. 连接建立后,服务端可主动向前端推送消息
    .Net6使用SignalR实现前后端实时通信,.net

上传的资源:

SignalR实时通信代码资源文章来源地址https://www.toymoban.com/news/detail-791213.html

到了这里,关于.Net6使用SignalR实现前后端实时通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序如何使用原生Websocket与Asp.Net Core SignalR 通信

    如题,这可能算是.net 做小程序的服务端时,绕不开的一个问题,老生常谈了。同样的问题,我记得我2018/19年的一个项目的解决方案是: 修改官方的SignalR.js的客户端 :把里面用到浏览器的Websocket改成微信小程序的官方api的。目前网上也有不少这样的方案,已经改好开源了;

    2024年02月08日
    浏览(32)
  • 微信小程序如何使用原生Websocket api与Asp.Net Core SignalR 通信

    如题,这可能算是.net 做小程序的服务端时,绕不开的一个问题,老生常谈了。同样的问题,我记得我2018/19年的一个项目的解决方案是: 修改官方的SignalR.js的客户端 :把里面用到浏览器的Websocket改成微信小程序的官方api的。目前网上也有不少这样的方案,已经改好开源了;

    2024年02月09日
    浏览(62)
  • ASP.NET Core实时库SignalR简单应用

    SignalR 是用于构建需要实时用户交互或实时数据更新的Web 应用程序的一个开放源代码.NET 库。不仅仅用在Web应用中,后面会讲到它的应用范围。它简化了简化了构建实时应用程序的过程,包括 ASP.NET Server 库和 JavaScript Client 库,以便管理Client与Server连接并将内容更新推送给Cl

    2024年02月11日
    浏览(35)
  • 服务端使用ASP.NET Core SignalR与Vue3(TypeScript与JavaScript)前端建立通信(以进度条为例)

    1. ASP.NET Core           ASP.NET Core 是一个跨平台、高性能及开源的框架,用于生成基于云且连接互联网的新式应用程式。 官方文档:ASP.NET documentation | Microsoft Learn  2.  ASP.NET Core SignalR         ASP.NET Core SignalR 是开源库,用于服务端与客户端建立实时通信,可以自动管理连接

    2024年02月06日
    浏览(31)
  • 从壹开始前后端开发【.Net6+Vue3】(二)前端创建

    工作后,学习的脚步一直停停走走,希望可以以此项目为基础,可以不断的迫使自己不断的学习以及成长 将以Girvs框架为基础,从壹开始二次开发一个前后端管理框架 在这过程中一步步去学习使用到的技术点,也同时会将在此过程中遇到的问题进行分享 项目地址 上文介绍到

    2024年02月10日
    浏览(27)
  • .net6中WPF的串口通信和USB通信

    之前写过串口通信,不过是winform的。 c#使用串口进行通信_c# 串口通信_故里2130的博客-CSDN博客 今天说一下,.net6中wpf的串口通信和USB通信,在工控行业中,这2种的方式非常多,还有网口通信,它们都是用来和硬件打交道的,进行交互信息。 一、串口通信 1.安装System.IO.Ports

    2024年02月16日
    浏览(29)
  • SignalR实战:在.NET Framework和.NET Core中如何使用SignalR?

    官网文档:https://learn.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?view=aspnetcore-6.0tabs=visual-studio SignalR开源代码:https://github.com/signalr 很多小伙伴问:在前后端分离项目中,后端是.NET Core前端是Vue如何使用SignalR?在前后端不分离项目中,.NET Framework MVC项目中又如何使用SignalR技术呢?

    2024年02月12日
    浏览(40)
  • ASP.NET Core 中使用 WebSocket 协议进行实时通信

    介绍 在 ASP.NET Core 中使用 WebSocket 协议创建实时通信的完整示例涉及几个步骤。在此示例中,我们将创建一个简单的聊天应用程序,用户可以在其中实时发送和接收消息。此示例假设您对 ASP.NET Core 和 C# 有基本了解。 步骤1.创建一个新的ASP.NET Core项目 首先,使用 Visual Studio 或

    2024年01月25日
    浏览(31)
  • 基于asp.netCoreWebApi的webSocket通信示例(net6)

    背景:     在阿里云服务器中搭建了常规的tcp server服务(基于.net framework 4.0)。用以实现远程控制家里的鱼缸灯,办公室的电脑开关机等功能。客户端采用PC桌面端和微信小程序端。     服务端:tcp server(基于.net framework 4.0)     客户端:PC桌面端软件(.net winform)、微信小程序

    2023年04月22日
    浏览(27)
  • WPF+ASP.NET SignalR实现简易在线聊天功能

    在实际业务中,当后台数据发生变化,客户端能够实时的收到通知,而不是由用户主动的进行页面刷新才能查看,这将是一个非常人性化的设计。有没有那么一种场景,后台数据明明已经发生变化了,前台却因为没有及时刷新,而导致页面显示的数据与实际存在差异,从而造

    2024年02月07日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包