我想用一个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);
}
Connection.SendAsync("服务端方法名",参数);
HubConnectionBuilder未包含WithUrl定义
试了Microsoft.AspNetCore.SignalR.Client8.0.0,7.0.14,6.0.25 三个版本
“HubConnectionBuilder”未包含“WithUrl”的定义
可以触发OnlineUserHub的OnConnectedAsync()方法
但是传递的token是空
而且无法触发ClientsSendMessagetoAll方法.
我在OnlineUserHub下添加了SendMessageToAll方法也无法触发
是不是token不应该放这里?
OnConnectedAsync()里Context.GetHttpContext().Request.Query获取的key是id,空值.
token值在Authorization里
用web页面访问
Context.GetHttpContext().Request.Query获取的key是access_token,值是token
Authorization里值是空
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
可以参考以这个服务端的链接:
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值,使用会使无法使用
登录 后才可以发表评论