.net 8.0 下 Blazor 通过 SignalR 与 Winform 交互

news2024/9/23 21:27:37

定义一个Hub

using Microsoft.AspNetCore.SignalR;

namespace Beatrane.Connect.Blazor
{
    public class DeviceHub : Hub
    {
        public async Task SendMessage(string user, string message)
        {
            await Clients.All.SendAsync("ReceiveMessage", user, message);
        }

        public async Task UpdateOnlineStatus(string deviceId, string status)
        {
            await Clients.All.SendAsync("OnlineStatusUpdated", deviceId, status);
        }
    }
}

程序初始化的时候要注册这个Hub

            const string hubsPrefix = "/hubs";
            app.MapGroup(hubsPrefix).MapHub<DeviceHub>("/devicehub");

在 Blazor 的一个页面接收来自客户端 Winform 的消息

    private HubConnection? _hubConnection;
    private string? _deviceId;
    private string? _status;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            var url = NavigationManager.ToAbsoluteUri("/hubs/devicehub");
            _hubConnection = new HubConnectionBuilder()
                .WithUrl(url)
                .Build();

            _hubConnection.On<string, string>("OnlineStatusUpdated", async (deviceId, status) =>
            {
                _deviceId = deviceId;
                _status = status;
                await InvokeAsync(StateHasChanged);
            });

            _hubConnection.Closed += async (error) =>
            {
                Console.WriteLine("Connection closed: " + error);
                await Task.Delay(new Random().Next(0, 5) * 1000);
                await _hubConnection.StartAsync();
            };

            await _hubConnection.StartAsync();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }

注意以下,下面说的是一个坑点,SignalR 的包,  VS 默认会建议你安装

Microsoft.AspNetCore.SignalR.Client.Core

但实际你要安装的是

Microsoft.AspNetCore.SignalR.Client

不然会少一个扩展类,没有 WithUrl 方法可以用了

那么上面Blazor服务端的事就做完了,非常简单。下面是Winform 客户端。因为咱使用的是 https,所以还有个连接时证书验证的问题。这里使用 clientHandler.ServerCertificateCustomValidationCallback = ValidateServerCertificate 直接返回 True 。等真的需要验证了再改写 ValidateServerCertificate 方法的逻辑

using Microsoft.AspNetCore.SignalR.Client;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        private HubConnection _hubConnection;

        public Form1()
        {
            InitializeComponent();
        }

        private bool ValidateServerCertificate(HttpRequestMessage message, X509Certificate2? certificate, X509Chain? chain, SslPolicyErrors errors)
        {
            return true;
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (_hubConnection is { State: HubConnectionState.Connected })
                {
                    await _hubConnection.InvokeAsync(@"UpdateOnlineStatus", Guid.NewGuid().ToString(), "Online");
                }
                else
                {
                    var url = @"https://localhost:5001/hubs/devicehub";
                    _hubConnection = new HubConnectionBuilder()
                        .WithUrl(url, options =>
                        {
                            options.HttpMessageHandlerFactory = handler =>
                            {
                                if (handler is HttpClientHandler clientHandler)
                                {
                                    clientHandler.ServerCertificateCustomValidationCallback = ValidateServerCertificate;
                                }
                                return handler;
                            };
                        })
                        .WithAutomaticReconnect()
                        .Build();
                    _hubConnection.ServerTimeout = TimeSpan.FromSeconds(5);

                    await _hubConnection.StartAsync();
                    await _hubConnection.InvokeAsync(@"UpdateOnlineStatus", Guid.NewGuid().ToString(), "Online");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
}

这个时候就可以把两端的程序跑来做验证了

每点击一次 Button1 ,Blazor 的网页端就会收到新的 guid。如此,通信便完成了 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050579.html

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

相关文章

静态分析、动态调试与重打包:去除Android APK烦人广告

最近&#xff0c;一直使用的某款APP&#xff0c;广告越来越多&#xff0c;更令人发指的是&#xff0c;广告弹框最后都变成无法关闭的形式&#xff0c;不使用会员压根没法正常使用。应用市场广大用户的评论说出了我们的心声。 虽说充会员可以免广告&#xff0c;这点小钱&#xf…

《python语言程序设计》2018版第7章第7题代数2x2线性方程式设计一个名为LinearEquation

#大家可以看一下 两道题的内容 第n次刷第4章第3题的代码。朝纲用来函数的概念 def judge_num(a, b, c, d):return (a * d) - (b * c)def run_cont(a, b, c, d, e, f):cc judge_num(a, b, c, d)if cc 0:print("The equation has no solution")else:x ((e * d) - (…

苹果手机怎么清理重复照片的解决方案

随着智能手机摄像头技术的飞速发展&#xff0c;我们越来越依赖iPhone来记录生活中的点点滴滴。不可避免地&#xff0c;这也导致了大量重复照片的产生&#xff0c;这些重复照片不仅占用了宝贵的存储空间&#xff0c;还使得照片库显得混乱无序。本文将介绍苹果手机怎么清理重复照…

微信小程序开发的强大助力:HTTP 虚拟专线

​编辑 一、微信小程序开发的热潮与挑战 二、HTTP 虚拟专线的引入 三、HTTP 虚拟专线的关键功能 &#xff08;一&#xff09;用于回调 &#xff08;二&#xff09;助力运维 四、HTTP 虚拟专线的技术优势 &#xff08;一&#xff09;80 和 443 端口的灵活访问 &#xff0…

测试架构师技能修炼---关系化透明

目录 一、该信任时就给别人信任 二、你说的话长久不变 三、道歉表明你的透明化 四、学会在做出反应前倾听 五、允许别人对你透明化 它涉及与别人之间的关系应保持透明化&#xff0c;包括给别人信任&#xff1b;持续给别人传递一致的消息&#xff1b;向别人道歉&#xff1b…

[SDK]-键盘消息和鼠标消息

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解键盘消息和鼠标消息&#xff0c;下一节讲解控件的相关知识点 键盘消息 应用程序从windows接收的关于键盘事件的消息分为击键和字符两种windows再发送击键消息的同时 还会发送字符消息Shift、ctrl、alt…

【C++】string讲解

一、string的理解 我们可以把string看作一个更高级用类实现的char* 。或者直接叫他字符串类型&#xff0c;一听就是定义字符串的。 二、string的使用 用法就和int、char 类型一样&#xff0c;而且功能比他们强大很多。 三、string的功能 只列举常用功能 1、通过“[]”访问…

日撸Java三百行(day26:栈实现二叉树深度遍历之前后序遍历)

目录 一、栈实现前序遍历 二、栈实现后序遍历 三、完整的程序代码 总结 一、栈实现前序遍历 先来看看我们之前写的用递归实现前序遍历的程序代码&#xff1a; /************************ Pre-order visit.**********************/public void preOrderVisit() {System.out…

Simple RPC - 06 从零开始设计一个服务端(上)_注册中心的实现

文章目录 Pre核心内容服务端结构概述注册中心的实现1. 注册中心的架构2. 面向接口编程的设计3. 注册中心的接口设计4. SPI机制的应用 5. 小结 Pre Simple RPC - 01 框架原理及总体架构初探 Simple RPC - 02 通用高性能序列化和反序列化设计与实现 Simple RPC - 03 借助Netty…

【与C++的邂逅】--- 类和对象(上)

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 与C的邂逅 本篇博客将讲解C中的类和对象&#xff0c;C是面向对象的语言&#xff0c;面向对象三大特性是封装,继承,多态。学习类和对象&#xff0c;我们可…

Adobe Dimension DN v4.0.2 解锁版下载和安装教程 (专业的三维3D建模工具)

前言 Adobe Dimension&#xff08;简称DN&#xff09;是一款3D设计软件&#xff0c;三维合成和渲染工具&#xff0c;2D平面的二维转为3D立体的三维合成工具&#xff0c;用于3Dmax\C4D\MAYA等三维软件生成的效果图&#xff0c;在3D场景中排列对象、图形和光照。3D应用程序使用的…

Nginx实验

编译安装 Nginx 准备rhel9环境 下载安装包nginx-1.24.0&#xff08;xftp&#xff09;/复制下载链接 &#xff08;nginx.org——>download&#xff09; 解压 [rootnginx nginx-1.24.0]# tar zxf nginx-1.24.0.tar.gz [rootnginx nginx-1.24.0]#tar zxf nginx-1.24.0.tar.…

yolov8安装教程

一、资源下载 1.下载YOLOv8代码 github:YOLOv8-github gitee:YOLOv8-gitee&#xff08;推荐使用国内的gitee&#xff09; 2.conda、cuda 如果没有安装conda&#xff0c;按照流程安装好conda&#xff0c;还要下载好符合自己电脑版本的CUDA 后续会用。 二、创建conda虚拟环…

C语言典型例题43

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题3.3 有一个函数&#xff1a;y{x,x<1;2x-1,1≤x≤10;3x-11,x≥10。写程序&#xff0c;输入x&#xff0c;输出y。 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //习题3.3…

OD C卷 - 传递悄悄话

传递悄悄话 &#xff08;100&#xff09; 给定一个二叉树&#xff0c;节点采用顺序存储&#xff0c;如 i0 表示根节点&#xff0c;2i 1 表示左子树根&#xff0c;2i 2 表示右子树根;每个节点站一个人&#xff0c;节点数值表示由父节点到该节点传递消息需要的时间&#xff1b…

周末休整

我写的东西&#xff0c;不爱看的人可以不看&#xff0c;我是给喜欢我的人写的&#xff0c;不喜欢我的人&#xff0c;我也讨厌她。 今天故意写点教人学坏的东西&#xff0c;因为以前写了很多正能量的东西&#xff0c;虽然阅读量还可以&#xff0c;但当见面聊天之后&#xff0c;…

【CSS】CSS新单位vmin和vmax

通过vmin单位可以自动取视口宽度和高度中较小的那个值&#xff0c;vmax同理。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

百度智能云通用文字识别(标准版)- java.lang.NoSuchFieldError: Companion

需求环境 ORC识别图片信息 参考百度示例 百度智能云API文档通用文字识别 官方示例 package baidu.com;import okhttp3.*; import org.json.JSONObject;import java.io.*;/*** 需要添加依赖* <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->…

8.16-ansible的应用

ansible ansible是基于模块工作的&#xff0c;本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块&#xff0c;ansible只是提供一种框架。 格式 ansible 主机ip|域名|组名|别名 -m ping|copy|... 参数 1.ping模块 m0 # 查看有没有安装epel ​ [rootm0 ~]#…

在vue3中配置scss

要在 Vue 3 中使用 SCSS&#xff08;Sass 的一个子集&#xff09;&#xff0c;你需要安装相应的依赖&#xff0c;并对项目进行一些配置。下面是详细的步骤&#xff1a; 步骤 1: 安装依赖 首先&#xff0c;你需要安装 sass 和 vue-loader&#xff08;如果你使用的是 Vue CLI&a…