首页 > 其他分享 >netcore webpi 通过signalr 给vue项目推送消息

netcore webpi 通过signalr 给vue项目推送消息

时间:2024-01-10 15:24:20浏览次数:26  
标签:vue Clients webpi 连接 signalr connId logger public

 最近项目上需要做个服务给前端推消息,首先就想到了signalr,关于signalr 详情可以参考微软官方文档(ASP.NET Core SignalR 概述 | Microsoft Learn),微软现在也有使用教程(ASP.NET Core SignalR 入门 | Microsoft Learn) 微软教程是通过使用库管理器 (LibMan) 从 unpkg 获取客户端库,如图:

但是我的vs里面没找到对应的客户端库。如果你页没有,那么你恭喜你,你有解决方案了!

第一步 安装对应包  Microsoft.AspNetCore.SignalR.Client

第二步 配置代码

 1 builder.Services.AddSignalR();
 2 //配置跨域
 3 builder.Services.AddCors(option =>
 4 {
 5     option.AddPolicy("any", policy =>
 6     {
 7         policy.SetIsOriginAllowed(origin => true)
 8        .AllowAnyHeader()
 9        .AllowAnyMethod()
10        .AllowCredentials();
11     });
12 });
13 
14 
15 
16 app.MapHub<LedHub>("/LedHub"); //配置hub
17 app.UseCors("any");  //使用跨域策略

第三步创建hub

  public class LedHub: Hub
  {
      private readonly ILogger<LedHub> _logger;
      private readonly IServiceProvider _service;
      private readonly IHttpContextAccessor _accessor;
      private readonly ConcurrentBag<LedResponse> onlineChat=new ConcurrentBag<LedResponse>();
 /// 这里不能注入 IHttpcontextaccessor 我用的是net8.0 
      public LedHub(ILogger<LedHub> logger,IServiceProvider service)
      {
          _logger = logger;
          _service = service;
      }

      /// <summary>
      /// 连接成功
      /// </summary>
      /// <returns></returns>
      public override Task OnConnectedAsync()
      {
          string connId = Context.ConnectionId;
          
          
          _logger.LogWarning("SignalR已连接");
          //验证Token
    
          //var httpContextAccessor= _service.GetRequiredService<IHttpContextAccessor>();
          //var token = httpContextAccessor.HttpContext?.Request.Query["access_token"];
          // var user = JwtHelper.SerializeJwt(token); 验证token
          _logger.LogWarning($"SignalR已连接,用户名:{connId}");
          LedResponse ledResponse = new();
          //连接用户 这里可以存在Redis

          //给当前连接返回消息 .Clients可以发多个连接ID
          ledResponse.connectId = connId;
          onlineChat.Add(ledResponse);
          Clients.Client(connId).SendAsync("ConnectResponse",
            "LED", "连接成功");

          return base.OnConnectedAsync();
      }

      public override Task OnDisconnectedAsync(Exception? exception)
      {
          string connId = Context.ConnectionId;
          var model = onlineChat.FirstOrDefault(u => u.connectId == connId);
          //int count = OnlineUser.RemoveAll(u => u.ConnectionId == connId);
          if (model != null)
          {
              //给当前分组发送消息 在一个分组就能接收到消息
              //Clients.Group(model.GroupName).SendAsync("GetUsersResponse", result);

              //给当前连接返回消息 .Clients可以发多个连接ID
              Clients.Client(connId).SendAsync("DisconnectResponse",
            "用户", "断开连接");

          }
          return base.OnDisconnectedAsync(exception);
      }

      /// <summary>
      /// 发送消息
      /// </summary>
      /// <param name="user"></param>
      /// <param name="message"></param>
      /// <returns></returns>
      public async Task SendMessage(string user, string message)
      {
          await Clients.All.SendAsync("ReceiveMessage", user, message);
      }
  }

这样服务已经搞定了!

接下来我们来写前端这块

npm install @microsoft/signalr

安装包

 1 <template>
 2   <div>
 3     <div class="first_row">{{ msg }}</div>
 4     <span class="last_row">{{ msg1 }}</span>
 5   </div>
 6 </template>
 7 
 8 
 9 <script setup lang="ts">
10 import * as signalR from "@microsoft/signalr";//一次性导入全部模块
11 import { onMounted, ref } from "vue";
12 const hubUrl = "http://localhost:7199/LedHub"; //api服务地址
13 
14 //.net core 版本中默认不会自动重连,需手动调用 withAutomaticReconnect
15 const connection = new signalR.HubConnectionBuilder()
16     .withAutomaticReconnect()//断线自动重连
17     .withUrl(hubUrl)//传递参数Query["access_token"]
18     .build();
19 
20 //启动
21 connection.start().catch(err => {
22     console.log("启动" + err);
23 });
24 
25 //自动重连成功后的处理
26 connection.onreconnected(connectionId => {
27     console.log(connectionId);
28 });
29 const msg=ref();
30 const msg1=ref();
31 const showvlue=ref();
32 onMounted(() => {
33     connection.on("SendMessageResponse", function (data) {
34         console.log(data);
35     });
36 
37     //调用后端方法 SendMessage 接受自己人发送消息
38     connection.on("ReceiveMessage", function ( msginfo,msginfo2) {
39    
40       
41       msg.value=msginfo;
42       msg1.value=msginfo2;
43 
44       
45     });
46 
47     //调用后端方法 ConnectResponse 接收连接成功
48     connection.on("ConnectResponse", function (data, msg) {
49         console.log(data + "==" + msg);
50     });
51 
52 });
53 
54 </script>

编写前端连接客户端!

接下来发送消息 在webApi controller 注入 IHubContext<LedHub> hub,即可使用!

  private readonly ILogger<WeatherForecastController> _logger;
  private readonly IHubContext<ChatHub> _hubContext;

  public WeatherForecastController(ILogger<WeatherForecastController> logger,IHubContext<ChatHub> hubContext)
  {
      _logger = logger;
      this._hubContext = hubContext;
  }

  [HttpGet(Name = "GetWeatherForecast")]
  public IEnumerable<WeatherForecast> Get()
  {
      _hubContext.Clients.All.SendAsync("ReceiveMessage", "xxx", "xxx");
      return Enumerable.Range(1, 5).Select(index => new WeatherForecast
      {
          Date = DateTime.Now.AddDays(index),
          TemperatureC = Random.Shared.Next(-20, 55),
          Summary = Summaries[Random.Shared.Next(Summaries.Length)]
      })
      .ToArray();
  }

 

到此已完成!

 

标签:vue,Clients,webpi,连接,signalr,connId,logger,public
From: https://www.cnblogs.com/hzr9527/p/17956463

相关文章

  • vue3利用qrcode.vue并通过canvas合并图片
    <template><canvasid="canvas"width="300"height="400"></canvas><el-buttonstyle="margin-top:20px"type="danger"plain@click="downloadCode"......
  • 5分钟搞定vue3函数式弹窗
    前言最近接到一个需求,需要在一些敏感操作进行前要求输入账号和密码,然后将输入的账号和密码加到接口请求的header里面。如果每个页面都去手动导入弹窗组件,在点击按钮后弹出弹窗。再拿到弹窗返回的账号密码后去请求接口也太累了,那么有没有更简单的实现方式呢?函数式弹窗的使用场景......
  • 基于SpringBoot+Vue的流浪动物领养信息系统设计实现(源码+lw+部署文档+讲解等)
    (文章目录)前言:heartpulse:博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌:heartpulse:......
  • python diango后端支持运行脚本+vue前端支持脚本运行
    #使用Python内置的subprocess模块来执行Python脚本#使用注意:#1,依赖包需要提前导入至脚本中#2,script_path变量是脚本得绝对路径#3,filename变量是脚本得名称#搭配vue页面使用#想法:页面支持导入,编辑,执行脚本#导入:默认指定路径下,需要填......
  • vscode设置vue3代码格式化
    下载插件可以使用Volar或Prettier  设置格式化时选用的插件mac:【shift】+【option】+【f】win:【shift】+【alt】+【f】 选择其中之一左下角选择【设置】 点击右上角的文件切换图标,可以切换到setting.json 实际使用假设这是默认代码状态 使用Prettier默认......
  • 基于SpringBoot+Vue的航班订票管理系统设计实现(源码+lw+部署文档+讲解等)
    (文章目录)前言:heartpulse:博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌:heartpulse:......
  • VUE框架的事件绑定与事件回调函数的this对象------VUE框架
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • Vue单页面应用开发指南
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • Vue学习计划-Vue3--初识Vue3,vite创建Vue3项目
    1.Vue3简介性能的提升打包大小减少41%初次渲染快55%,更新渲染快133%内存减少54%源码的升级使用Proxy代替defineProperty实现响应式重写虚拟DOM的实现和Tree-Shaking拥抱TypeScriptVue3可以更好的支持TypeScript新的特性CompositionApi(组合Api)setupref......
  • 前端歌谣-第伍拾伍课-vue2-element组件封装el-button-groups
    前言大家好我是歌谣今天继续给大家带来elementui组件el-button的封装使用方法<btn-groups:btns="btns":max="max"class="page-btns"></btn-groups>参数部分name控制属性名显示按钮的名称{{item.name}}btns:[{//按钮名称name:"歌谣&qu......