asp.net core webapi signalR通信

news/2024/5/19 23:39:58 标签: .netcore, signalR

1.前端使用npm 导入signalR的包和jquery包
npm install jquery -y
npm install @micosoft/signalr -y

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>实时通讯</title>
    <h1>signalr入门</h1>
</head>
<body>
    <input type="button" value="发送" id="btnSend">
</body>
</html>
<script src="node_modules/jquery/dist/jquery.min.js"></script>
<script src="node_modules/@microsoft/signalr/dist/browser/signalr.min.js"></script>
<script>
 //创建连接对象
 var connection=new signalR.HubConnectionBuilder()
 .withUrl("https://localhost:7177/myHub")
 .build();
//当连接成功时
connection.start().then(function(){
    console.log("客户端连接成功");
})
//接收服务端主动推送过来的消息
connection.on("ReceiveMsg",function(msg){
alert(msg)
})
connection.on("completeOrder",function(msg){
alert(msg)
})
$("#btnSend").click(function(){
//客户端主动调用服务定义的通讯方法
connection.invoke("SendMsg",1,"测试").catch(function(err){
console.log(err)
})
})
</script>

后端–program中注入signalR的服务和跨域服务

 builder.Services.AddSignalR();
 //配置跨域
            builder.Services.AddCors(opt =>
            {
                opt.AddPolicy("ws.client", p =>
                {
                    p.AllowCredentials();
                    p.AllowAnyHeader();
                    p.AllowAnyMethod();
                    p.SetIsOriginAllowed(s => true);
                });
            });
 ......
 app.MapHub<MyHub>("/myHub");
 app.UseCors("ws.client");

新建一个hub类

using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Caching.Memory;

namespace WebApplication1.Hubs
{
    public class MyHub : Hub
    {
        private readonly IMemoryCache _memoryCache;

        public MyHub(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }

        //当客户端成功连接时,会触发的方法
        public override Task OnConnectedAsync()
        {
            var cacheKey = "items_1";
            var cacheEntryOptions = new MemoryCacheEntryOptions()
                .SetSlidingExpiration(TimeSpan.FromMinutes(30));

            _memoryCache.Set(cacheKey, Context.ConnectionId, cacheEntryOptions);
            return Task.CompletedTask;
        }

        //当客户端断开连接时,需要触发的方法
        public override Task OnDisconnectedAsync(Exception? exception)
        {
            _memoryCache.Remove("items_1");
            return Task.CompletedTask;
        }

        public async void SendMsg(long userId, string msg)
        {
            string sendMsg = $"服务端收到了客户端的消息,参数user={userId},msg={msg}";
            //服务端主动推送消息给所有的客户端
            //await Clients.All.SendAsync("ReceiveMsg", sendMsg);
            //给除了自己以外的所有客户端发送消息
            await Clients.Others.SendAsync("ReceiveMsg", sendMsg);
        }
    }
}

控制器类

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Caching.Memory;
using WebApplication1.Hubs;

namespace WebApplication1.Controllers
{
    [ApiController]
    [Route("[controller]/[action]")]
    public class WeatherForecastController : ControllerBase
    {
        private readonly IMemoryCache _memoryCache;
        private readonly IHubContext<MyHub> _hubContext;

        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, IMemoryCache memoryCache, IHubContext<MyHub> hubContext)
        {
            _logger = logger;
            _memoryCache = memoryCache;
            _hubContext = hubContext;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            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();
        }

        [HttpPost]
        public void AddOrder()
        {
            var connectionId = _memoryCache.Get("items_1").ToString();
            //服务端向指定客户端发送信息。
            _hubContext.Clients.Client(connectionId).SendAsync("completeOrder", "订单完成");
        }
    }
}

http://www.niftyadmin.cn/n/5119816.html

相关文章

BUUCTF wireshark 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 黑客通过wireshark抓到管理员登陆网站的一段流量包&#xff08;管理员的密码即是答案) 密文&#xff1a; 下载附件&#xff0c;解压后得到一个.pcap文件。 解题思路&#xff1a; 1、双击文件&#xff0c;在wires…

基于多尺度分形残差注意力网络的超分辨率重建算法

1.引言 深度神经网络可以显著提高超分辨率的质量&#xff0c;但现有方法难以充分利用低分辨率尺度特征和通道信息&#xff0c;从而阻碍了卷积神经网络的表达能力。针对此类问题&#xff0c;本章提出了一种多尺度分形残差注意力网络&#xff08;Multi-scale Fractal Residual A…

Edge浏览器中常用的20个快捷键

Microsoft Edge&#xff0c;和许多其他网络浏览器一样&#xff0c;设有一系列的键盘快捷方式&#xff0c;旨在提高用户效率。以下是Edge浏览器的20个实用快捷键&#xff1a; Ctrl T - 打开一个新标签页。Ctrl W&#xff08;或 Ctrl F4&#xff09;- 关闭当前标签页。Ctrl …

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例 在matlab中有自带的离散傅里叶变换程序&#xff0c;即fft程序&#xff0c;但该程序是封装的&#xff0c;无法看到源码。为了比较清楚的了解matlab自带的实现过程&#xff0c;本文通过自建程序实现matlab程序&…

C++前缀和算法的应用:装包裹的最小浪费空间 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你 n 个包裹&#xff0c;你需要把它们装在箱子里&#xff0c;每个箱子装一个包裹。总共有 m 个供应商提供 不同尺寸 的箱子&#xff08;每个规格都有无数个箱…

Git的远程仓库

Git的远程仓库 添加远程仓库从远程库克隆 添加远程仓库 你在本地创建了一个Git仓库后&#xff0c;又想在GitHub创建一个Git仓库&#xff0c;并且让这两个仓库进行远程同步&#xff0c;这样&#xff0c;GitHub上的仓库既可以作为备份&#xff0c;又可以让其他人通过该仓库来协作…

【自然语言处理】理解词向量、CBOW与Skip-Gram模型

文章目录 一、词向量基础知识1.1 One-hot表示1.2 Distributed表示 二、word2vec基础知识2.1 CBOW和Skip-gram 三、基于Hierarchical Softmax的 CBOW 模型和 Skip-gram 模型3.1 CBOW 模型3.2 Skip-gram 模型 参考资料 由于计算机不能直接对各种字符进行运算&#xff0c;为此需要…

SpringBoot运行流程源码分析------阶段三(Spring Boot外化配置源码解析)

Spring Boot外化配置源码解析 外化配置简介 Spring Boot设计了非常特殊的加载指定属性文件&#xff08;PropertySouce&#xff09;的顺序&#xff0c;允许属性值合理的覆盖&#xff0c;属性值会以下面的优先级进行配置。home目录下的Devtool全局设置属性&#xff08;~/.sprin…