835 Star 6.4K Fork 2.6K

zuohuaijun / Admin.NET

 / 详情

WPF客户端怎么用SignalR给所有用户发送消息?

已完成
创建于  
2023-11-16 10:15

我想用一个wpf客户端结合Admin.NET的SignalR实现收发消息功能,
之前有自己写WebAPI简单实现,改用Admin.NET之后无法连接SignalRHub.
Admin.NET的OnlineUserHub下的OnConnectedAsync()方法,需要验证Token.
WPF客户端直接调用Start()方法,无法连接,所以无法实现消息收发.
Connection.State的状态一直是Connecting
下面是我的WPF客户端的连接和发送方法.接收消息的方法也不知道怎么写,网上抄的代码报错.
求大神指点!

public IHubProxy HubProxy { get; set; }
const string ServerURI = "http://localhost:5005/hubs/onlineUser";
public HubConnection Connection { get; set; }


public void ConnectionServer()
{
    Connection = new HubConnection(ServerURI);
    HubProxy = Connection.CreateHubProxy("OnlineUserHub");
    var a = Connection.State;
    Connection.Start();
    SendMessage();
}

public void SendMessage()
{
    MessageInput testMsg = new MessageInput
    {
        UserId = 1,
        Title = "123",
        MessageType=0,
        Message ="aaaaaa"
    };
    HubProxy.Invoke("ClientsSendMessagetoAll", testMsg);
}

评论 (13)

PChief 创建了任务
PChief 修改了描述
展开全部操作日志

Connection.SendAsync("服务端方法名",参数);

我不是请求要用HttpClient请求API
而是Microsoft.AspNet.SignalR.Client请求SignalR实现消息实时转发功能

已经贴了wpf客户端代码了
可以看看

HubConnectionBuilder未包含WithUrl定义
试了Microsoft.AspNetCore.SignalR.Client8.0.0,7.0.14,6.0.25 三个版本
“HubConnectionBuilder”未包含“WithUrl”的定义
输入图片说明

我用的7.0.8,我先看看升级后要怎么修改

我这边已经升级过了,也是正常的,我这边是.NET6 WPF 桌面应用程序

可以触发OnlineUserHub的OnConnectedAsync()方法

但是传递的token是空

而且无法触发ClientsSendMessagetoAll方法.

我在OnlineUserHub下添加了SendMessageToAll方法也无法触发

你的token你调试OnConnectedAsync()看一下http请求 会被自动解析成Claim的,你多调试一下,还找不到问题,再找我直接给你写一个demo

是不是token不应该放这里?
OnConnectedAsync()里Context.GetHttpContext().Request.Query获取的key是id,空值.
token值在Authorization里
输入图片说明
用web页面访问
Context.GetHttpContext().Request.Query获取的key是access_token,值是token
Authorization里值是空
输入图片说明

我给你个demo ,稍等

zuohuaijun 任务状态待办的 修改为已完成
PChief 修改了描述
PChief 修改了描述
zuohuaijun 任务状态已完成 修改为进行中
PChief 修改了描述
PChief 修改了描述

可以参考以这个服务端的链接:
wss://mydomain.com:5005/hubs/onlineUser?access_token=234wer3.234wesdfe.dfsdfs
输入图片说明

WPF客户端

          _connection = new HubConnectionBuilder()
.WithUrl("http://localhost:5005/hubs/onlineUser", option =>
{
    option.AccessTokenProvider = () => Task.FromResult(token);
    option.HttpMessageHandlerFactory = (message) =>
    {
        if (message is HttpClientHandler clientHandler)
            clientHandler.ServerCertificateCustomValidationCallback +=
            (re, certificate, chain, sslPolicyErrors) => { return true; };
        return message;
    };
}).WithAutomaticReconnect(new RandomRetryPolicy()).Build();

OnConnectedAsync()方法里Claims获取方式改成如下即可

var userId =Context.User.Claims.FirstOrDefault(t => t.Type == ClaimConst.UserId)?.Value;
var tenantId = Context.User.Claims.FirstOrDefault(t => t.Type == ClaimConst.TenantId)?.Value; 

PS:Web端使用的Request.Query传递Token值,使用会使无法使用

zuohuaijun 任务状态进行中 修改为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(3)
7623586 lfuxin 1667808399
C#
1
https://gitee.com/zuohuaijun/Admin.NET.git
git@gitee.com:zuohuaijun/Admin.NET.git
zuohuaijun
Admin.NET
Admin.NET

搜索帮助