SignalR实现简单的Web端实时通讯,跳过WebSocket验证,Swagger加锁后不能访问接口,Script setup不支持动态绑定

news/2024/12/2 16:11:13/

版本.Net6+Vue3+Element-Plus

问题

  1. Swagger加锁后不能访问接口 (看第三步)
  2. 跳过WebSocket验证 (看第四步里面)
  3. 添加自定义接受方法 (看第四步)
  4. 不能使用

第一步、下载包

后端:
在这里插入图片描述
前端:命令

npm install @microsoft/signalr

第二步、加后端触发方法

后端:

public class ServerHub : Hub{/// <summary>/// 已连接的用户信息/// </summary>public static List<UserModel> OnlineUser { get; set; } = new List<UserModel>();private readonly ILogger<ServerHub> _logger;private readonly IHttpContextAccessor _accessor;public ServerHub(ILogger<ServerHub> logger, IHttpContextAccessor accessor){_logger = logger;_accessor = accessor;}/// <summary>/// 当连接成功时执行/// </summary>public override Task OnConnectedAsync(){string connId = Context.ConnectionId;_logger.LogWarning("SignalR已连接");//验证Token    "access_token"这个值是默认的不要改var token= _accessor.HttpContext.Request.Query["access_token"];var user = JwtHelper.SerializeJwt(token);_logger.LogWarning("SignalR已连接,用户名:" + user.UserName);//连接用户 这里可以存在Redisvar model= new UserModel{ConnectionId = connId,Token = token,UserName = user.UserName};OnlineUser.Add(model);//给当前连接返回消息 .Clients可以发多个连接ID// "ConnectResponse"这个是前端接收的方法名字Clients.Client(connId).SendAsync("ConnectResponse", new ApiResult<UserModel>() {state=200,data = model,msg= user.UserName+"连接成功" });return base.OnConnectedAsync();}/// <summary>/// 当连接断开时的处理/// </summary>public override Task OnDisconnectedAsync(Exception exception){string connId = Context.ConnectionId;var model = OnlineUser.Find(u => u.ConnectionId == connId);int count = OnlineUser.RemoveAll(u => u.ConnectionId == connId);if (model != null){//给当前连接返回消息 .Clients可以发多个连接ID// "DisconnectResponse"这个是前端接收的方法名字Clients.Client(connId).SendAsync("DisconnectResponse",new ApiResult<bool>(){state = 1000,data = true,msg = "断开连接"});}return base.OnDisconnectedAsync(exception);}/// <summary>/// 自定义方法:接受用户的数进行推送/// </summary>/// <returns></returns>public async Task SendMessage(string user,string msg){ApiResult<UserModel> result = new ApiResult<UserModel>();result.data = new UserModel{ConnectionId = Context.ConnectionId,Token = "",UserName = user};result.state = 200;result.msg = msg;//推送给所有连接ID的第一条数据await Clients.Clients(OnlineUser.Select(q=>q.ConnectionId).ToList()).SendAsync("SendMessage", result);}}

第三步、在Program.cs中添加配置

builder.Services.AddSignalR();

再向中间管道添加终结点

app.UseRouting();
app.UseEndpoints(endpoints =>
{endpoints.MapControllers();endpoints.MapHub<ServerHub>("/ServerHub");endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
});

Swagger加锁后不能访问接口
在这里插入图片描述
加锁后的配置方式稍微有点差别(我当时找了半天问题)
等于说把他拆出来了

app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
app.UseAuthentication();
app.UseAuthorization();
app.MapHub<ServerHub>("/ServerHub");

第四步、加前端接收方法

前端: 重点注意没有

<template><div><input type="text" placeholder="请输入用户名" v-model="user" /><input type="text"  placeholder="请输入内容" v-model="msg"><button  @click="Submit">发送消息</button><br/><textarea type="text"  v-model="txt" ></textarea></div>
</template><script>import store from '@/store/index' //这个可以不加,这个是我localStorage缓存的东西import * as signalR from "@microsoft/signalr"; let hubUrl ="http://localhost:5193/serverHub";//实例化
const connection = new signalR.HubConnectionBuilder()
.withAutomaticReconnect()
.withUrl(hubUrl,{accessTokenFactory:()=>store.state.user.refreshToken,//添加Token验证skipNegotiation:true, //是否跳过协议 truetransport:signalR.HttpTransportType.WebSockets //跳过Websocket协议})
.build();
//启动
connection.start().catch(err=>{connsole.log(err)});
export default({data(){return {txt:"",user: "",msg: ""}},methods: {Submit: function() {if(this.msg.trim()==""){alert("不能发送空白消息");return;}//访问自定义后端方法"SendMessage"connection.invoke("SendMessage", this.user, this.msg);this.msg = "";}},
created(){
var _this = this;
//"ConnectResponse" 与后端里面的名字对应,根据名字返回到这个方法里面
connection.on("ConnectResponse", function(data) {if(data.code==1)_this.txt = data.message;})//接收
connection.on("SendMessage", function(data) {if(data.code==1)_this.txt = data.message;})
}
})</script>

结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/671b432330194b6db9375d5e830a3e6c.png


http://www.ppmy.cn/news/56096.html

相关文章

Java版本企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

docker容器原理及简单且详细的使用

docker原理简单介绍 docker是一种虚拟化容器技术。 虚拟化&#xff1a;早期为了节约成本和学习只有在宿主机中基于 kvm&#xff08;基于内核的虚拟机&#xff09;等技术虚拟出来完整的操作系统&#xff0c;而这个完整的操作系统会大量的占用宿主机的硬件资源&#xff0c;当创建…

垃圾回收器ZGC应用分析总结

目录 一、基本概述 二、基本关键技术知识总结 &#xff08;一&#xff09;三色标记法&#xff08;着色指针&#xff09; &#xff08;二&#xff09;读屏障 &#xff08;三&#xff09;多图映射 &#xff08;四&#xff09;简单场景说明ZGC并发 三、基本回收原理介绍 四…

成为黑客猎手:从零开始学习漏洞挖掘的完整指南

一.了解基础知识 学习计算机网络、操作系统、编程语言等相关基础知识&#xff0c;这些知识对于后续的漏洞挖掘和利用非常重要。具体建议如下&#xff1a; 学习计算机网络基础知识&#xff0c;例如 OSI 模型、TCP/IP 协议、HTTP 协议等。推荐书籍&#xff1a;《计算机网络》。…

智融合·共未来丨智合同携手百融云创打造合同智能化应用服务平台

人工智能技术是当今社会的热议话题之一。近年来&#xff0c;众多企业在人工智能领域持续布局&#xff0c;相关技术已在社会生产各环节极大地提高了生产效率。如果把过去信息技术产业的发展比喻为“手工时代”&#xff0c;那么人工智能技术的出现则将把信息技术产业推向“自动化…

Linux常用命令——ip6tables命令

在线Linux命令查询工具 ip6tables linux中防火墙软件 补充说明 ip6tables命令和iptables一样&#xff0c;都是linux中防火墙软件&#xff0c;不同的是ip6tables采用的TCP/ip协议为IPv6。 语法 ip6tables(选项)选项 -t<表>&#xff1a;指定要操纵的表&#xff1b; …

Python深度学习十大核心算法!

深度学习已经成为了一种热门的技术,它的应用领域正在不断扩大。在深度学习中,有一些核心的算法是非常重要的,这些算法为深度学习的应用提供了强大的基础。在本文中,我们将介绍基于Python深度学习的十大核心算法。 卷积神经网络卷积神经网络(Convolutional Neural Network,…

【方法】 如何批量将RAR或其他压缩格式转换成ZIP?

压缩文件的格式有很多种&#xff0c;比如RAR、ZIP、7-Zip、CAB、ARJ、ACE、TAR、BZ2等等。因为需求不同&#xff0c;或者不同平台对上传的压缩包格式要求不同&#xff0c;我们往往需要把压缩文件进行格式转换&#xff0c;那压缩文件不同格式之间如何进行转换呢&#xff1f; 如…