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

定义一个Hub

cs 复制代码
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

cs 复制代码
            const string hubsPrefix = "/hubs";
            app.MapGroup(hubsPrefix).MapHub<DeviceHub>("/devicehub");

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

cs 复制代码
    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 默认会建议你安装

cs 复制代码
Microsoft.AspNetCore.SignalR.Client.Core

但实际你要安装的是

cs 复制代码
Microsoft.AspNetCore.SignalR.Client

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

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

cs 复制代码
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。如此,通信便完成了

相关推荐
csdn_aspnet1 个月前
使用 .NET Core 7 SignalR 构建实时聊天应用程序
signalr·.net7
csdn_aspnet1 个月前
.NET 9.0 SignalR 支持修剪和原生 AOT
aot·signalr·.net9
包达叔2 个月前
Admin.Net中的消息通信SignalR解释
signalr
百锦再2 个月前
.Net 优秀框架 ABP全面详解
microsoft·.net·web·blazor·abp·razor
百锦再2 个月前
Razor编程中@Helper的用法大全
.net·web·blazor·tag·core·razor·helper
时光追逐者2 个月前
一个开源的 Blazor 跨平台入门级实战项目
c#·asp.net·.net core·blazor
known3 个月前
基于Blazor实现的运输信息管理系统
blazor
csdn_aspnet4 个月前
使用 SignalR 在 .NET Core 8 最小 API 中构建实时通知
signalr·.net8
csdn_aspnet4 个月前
在 .NET 8 中使用自定义令牌身份验证掌握 SignalR Hub 安全性
signalr·.net8
时光追逐者4 个月前
在 Blazor 中使用 Chart.js 快速创建数据可视化图表
开发语言·javascript·信息可视化·c#·.net·blazor