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

news2024/11/28 4:41:26

版本.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);
            //连接用户 这里可以存在Redis
            var 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, //是否跳过协议 true
          transport: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.coloradmin.cn/o/470981.html

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

相关文章

Android内存优化场景

1、集合类 内存泄露原因 集合类 添加元素后&#xff0c;仍引用着 集合元素对象&#xff0c;导致该集合元素对象不可被回收&#xff0c;从而 导致内存泄漏实例演示 // 通过循环申请Object 对象 & 将申请的对象逐个放入到集合List List<Object> objectList new Arra…

VBA-自定义面板,使用SQL查询Excel数据

需求 定制插件&#xff0c;实现用户打开任意一个工作簿&#xff0c;写sql对Excel中的数据进行查询 案例sql需求场景&#xff1a; 需求 筛选日期小于’2023-4-24’&#xff0c;按group分区&#xff0c;求和各分组下的销售额&#xff0c;返回结果集新建工作表写入 数据源 现…

Docker-compose 启动 lnmp 开发环境

GitHub传送阵 docker-lnmp 项目帮助开发者快速构建本地开发环境&#xff0c;包括Nginx、PHP、MySQL、Redis 服务镜像&#xff0c;支持配置文件和日志文件映射&#xff0c;不限操作系统&#xff1b;此项目适合个人开发者本机部署&#xff0c;可以快速切换服务版本满足学习服务新…

国产开源项目管理软件ZenTao

本文应网友 ukiyoec 要求而写&#xff1b; 什么是禅道 &#xff1f; 禅道 (ZenTao)是国产开源项目管理软件。它集产品管理、项目管理、质量管理、文档管理、组织管理和事务管理于一体&#xff0c;是一款专业的研发项目管理软件&#xff0c;完整覆盖了研发项目管理的核心流程。禅…

2023-Hive性能企业级调优

Hive作为大数据平台举足轻重的框架&#xff0c;以其稳定性和简单易用性也成为当前构建企业级数据仓库时使用最多的框架之一。 但是如果我们只局限于会使用Hive&#xff0c;而不考虑性能问题&#xff0c;就难搭建出一个完美的数仓&#xff0c;所以Hive性能调优是我们大数据从业…

前端周总结

在vue里面引入ts文件报错&#xff1a; An import path cannot end with a .ts extension. Consider importing xx.js instead. 方法一&#xff08;最快&#xff09; 把引入的xx.ts后缀删除 方法二 # 在tsconfig.json中加入以下配置 "baseUrl": ".", &quo…

Oracle LiveLabs实验:DB Security - Data Masking and Subsetting (DMS)

概述 本实验介绍了适用于 Enterprise Manager 的 Oracle 数据屏蔽和子集 (DMS) 包的各种特性和功能。 它使用户有机会学习如何配置这些功能&#xff0c;以便在非生产环境中保护他们的敏感数据。 此实验申请地址在这里&#xff0c;时间为60分钟。 本实验也是DB Security Adva…

String AOP

AOP AOP(Aspect Object programmar) 面向切面编程&#xff0c;它是对某一类问题的统一处理&#xff0c;而StringAOP就是AOP思想的一种具体实现就像Ioc和DI。 AOP组成 切面(Aspect) 切⾯&#xff08;Aspect&#xff09;由切点&#xff08;Pointcut&#xff09;和通知&#x…

论文阅读笔记《Grounded Action Transformation for Robot Learning in Simulation》

Grounded Action Transformation for Robot Learning in Simulation 发表于AAAI 2017 仿真机器人学习中的接地动作变换 Hanna J, Stone P. Grounded action transformation for robot learning in simulation[C]//Proceedings of the AAAI Conference on Artificial Intellig…

Linux中的阻塞机制

我们知道在字符设备驱动中&#xff0c;应用层调用read、write等系统调用终会调到驱动中对应的接口。 可以当应用层调用read要去读硬件的数据时&#xff0c;硬件的数据未准备好&#xff0c;那我们该怎么做&#xff1f; 一种办法是直接返回并报错&#xff0c;但是这样应用层要获得…

linux通配符和正则表达式深层解析...

目录&#xff1a; (一)了解通配符和正则的作用 (二)通配符的使用 (三)正则表达式的使用 (四)扩展正则表达式的使用 (一)了解通配符和正则的作用 (1.1)在我们日常的工作中&#xff0c;我们都会使用到通配符或者正则表达式。通配符是一种特殊语句&#xff0c;主要有星号(*)和问号…

交换机和路由器到底有什么区别???

我&#xff1a;度娘度娘&#xff0c;交换机和路由器的区别是什么呢&#xff1f; 度娘&#xff1a;一个工作在第二层数据链路层&#xff0c;一个工作在第三层网络层。 我&#xff1a;哈&#xff1f;那工作在不同层会有什么区别&#xff1f;为什么要工作在不同层&#xff1f; …

2023五一数学建模A题完整思路

已更新五一数学建模A题思路&#xff0c;文章末尾获取&#xff01; A题完整思路&#xff1a; A题是一个动力学问题&#xff0c;需要我们将物理学概念运用到实际生活中&#xff0c;我们可以先看题目 问题1&#xff1a; 假设无人机以平行于水平面的方式飞行&#xff0c;在空中投…

Windows11安装sqlserver2012失败后解决方案

首先卸载 WinR打开运行输入services.msc查看所有服务/或者我的电脑管理找到服务列表/任务管理器进入服务列表&#xff0c;停止所有与Sql Server有关的服务&#xff0c;如下&#xff1a; 打开控制面板-卸载sqlserver所有相关软件&#xff1b; 删除SQL Server相关注册表&#…

【观察】中国软件行业进入“重构期”,看浪潮海岳如何“开新局”

众所周知&#xff0c;改开四十多来年&#xff0c;中国软件产业在经历了萌芽与低谷、摸索与转型后&#xff0c;逐步进入了快速发展期。特别是过去几年&#xff0c;在新的发展格局&#xff0c;信创替代的进程中&#xff0c;整个中国软件业更是加速进入了全新的“重构期”。 在此过…

Unity API详解——Quaternion类

Quaternion类又称四元数&#xff0c;由x、y、z和w这4个分量组成&#xff0c;属于struct类型。在Unity中&#xff0c;用Quaternion来存储和表示对象的旋转角度。Quaternion的变换比较复杂&#xff0c;对于GameObject一般的旋转及移动&#xff0c;可以用Transform中的相关方法实现…

CH32V307环境参数在线监测系统(一)

CH32V307环境参数在线监测系统是以CH32V307VCT6为核心&#xff0c;由ESP8266模块、DHT11温湿度传感器模块、TFT LCD显示屏组成。系统实物图如下所示&#xff1a; 系统功能主要有RTC实时时钟、WIFI网络授时、DHT11温度测量、温湿度数据实时上传到onenet平台、屏幕定时刷新等功能…

在Docker上安装和运行MySQL容器(纯步骤)

在Docker上安装和运行MySQL步骤 本文章只有操作步骤&#xff0c;没有原理解释&#xff0c;只是在学习当中提醒自己安装步骤。 第一步&#xff1a;从远程仓库拉取MySQL镜像 1.从远程仓库搜索mysql镜像 docker search mysql2.pull拉取镜像 这里我选择的是mysql的5.7版本 docker…

盘点 5 个 yyds 的 AI 绘画辅助工具

国外著名的 AI 作图工具 Midjourney、Stable Diiffusion 都可以根据你输入的指令生成一张图片。 如果你想输出高质量的图片&#xff0c;需要掌握一些 prompt 指令技巧。本文章便盘点了 5 个 GitHub 上的开源项目&#xff0c;引领你更好的上手 AI 作图。 本期推荐开源项目目录&…

软件杯龙源风电赛题培训!千万分钟数据和全流程基线等你来战

‍‍ “中国软件杯”大学生软件设计大赛是一项面向中国在校学生的公益性赛事&#xff0c;大赛由国家工业和信息化部、教育部、江苏省人民政府共同主办&#xff0c;是全国软件行业规格最高、最具影响力的国家级一类赛事。其中&#xff0c;作为重点赛题的龙源风电赛&#xff0c;上…